SORU
30 Mart 2009, PAZARTESİ


Nasıl eğer o ölürse bir yeniden başlatma işlemi için bir bash betiği yazmak mı?

Sıra kontrol ve her öğe üzerinde bir işlem yapılıyor olacak bir python komut dosyası var:

# checkqueue.py
while True:
  check_queue()
  do_something()

Nasıl çalışıyor eğer kontrol edecek bir bash script yazmanın ne anlamı var, ve değilse, başlatın. Aşağıdaki sahte kod (ya da belki de ps | grep? gibi bir şey yapmak gerekir) kabaca:

# keepalivescript.sh
if processidfile exists:
  if processid is running:
     exit, all ok

run checkqueue.py
write processid to processidfile

Bir crontab gelen ararım:

# crontab
*/5 * * * * /path/to/keepalivescript.sh

Şimdiden teşekkürler.

CEVAP
30 Mart 2009, PAZARTESİ


PID-dosyaları, crons, ya da olmayan işler değerlendirmeye çalışır başka bir şey çocuklarının kaçının.

UNIX, SADECE çocuğuna bekleyebilirsin neden çok iyi bir nedeni var. (Ps ayrıştırma, pgrep, PID, depolama, ...) herhangi bir yöntem kusurlu ve ağzı açık deliklere sahip geçici bir çözüm bulmak için çalışır. Sadece söylehayır.

Süreci' ebeveyn olmak sürecini izleyen bir süreç lazım Bu ne anlama geliyor? Sadece süreci anlamına gelirbaşlarişleminizi güvenilir bir şekilde bunun için sonuna kadar bekleyebilir. Bash, bu kesinlikle önemsiz değildir.

until myserver; do
    echo "Server 'myserver' crashed with exit code $?.  Respawning.." >&2
    sleep 1
done

Bash kod yukarıdaki parça until bir döngü içinde myserver çalışır. İlk çizgi myserver başlar ve bunun için sonuna kadar bekler. Bu iş sona erdiğinde until çıkış durumunu denetler. Eğer çıkış durumu ise 0 düzgün bir şekilde kapatmanız sordu, ve bu yüzden başarılı oldu anlamına gelir) bittiği anlamına geliyor. Bu durumda (biz sadece onu kapatmak istedi!) yeniden başlatmak istemiyoruz. Eğer çıkış durumudurdeğil0, until STDERR hata iletisi gösterir ve döngü yeniden başlar döngü vücut çalışır (hat 1 geri)1 saniye sonra.

Neden bir dakika? Bir şey myserver başlatma sırasını yanlış ve hemen çöküyor çünkü, sürekli yeniden ve ellerini üzerine çökmesini çok yoğun bir döngü olacak. sleep 1 bu yükü alır.

Şimdi yapmanız gereken tüm bu bash script (zaman uyumsuz olarak, muhtemelen), ve myserver monitör ve gerekirse yeniden başlar. Eğer başlamak istiyorsanız önyükleme (sunucu yapma "@reboot kuralı ile" yeniden doğmuş gibi), kullanıcı cron içinde zamanlayabilirsiniz(1) hayatta kalmak. monitör Açık cron crontab kurallar:

crontab -e

Ekleyin monitör komut dosyasını başlatmak için bir kural:

@reboot /usr/local/bin/myservermonitor

Alternatif olarak; verilmiş(5) ve /etc/bak verilmiş. Orada bir satır myserver ınit belirli bir düzeyde başlatmak için ekleyin ve otomatik olarak respawned olabilirsiniz.


Edit.

Bana neden biraz bilgi ekleyelimdeğilPID dosyaları kullanın. Çok popüler olsa da, aynı zamanda çok kusurlu olduklarını ve bunu doğru şekilde yapmak istemezsin neden yok.

Bu göz önünde bulundurun:

  1. Geri dönüşüm (yanlış işlemi öldürme) PID:

    • /etc/init.d/foo start: foo, foo'29* *s PID . yazmaya başla
    • Bir süre sonra: foo bir şekilde ölür.
    • Bir süre sonra başlayan herhangi bir rasgele süreç (bar çağrı) rastgele bir PID, foo'In eski PID. almayı hayal alır
    • Dikkat edin foogitmiş: /etc/init.d/foo/restart okur /var/run/foo.pid Çek, Eğer hala hayatta bulur bar düşünüyor foo, öldürür, başlar yeni bir foo.
  2. Dosyaları bayat gidip PID. Karmaşık (ya da, önemsiz olmayan mı demeliyim) mantık PID dosyası bayat olup olmadığını kontrol etmeniz gerekir, ve bu tür mantık yine 1. açıktır.

  3. Eğer yazma erişimi veya salt okunur bir ortamda bile yok eğer doğru değilse ne?

  4. Anlamsız overcomplication; yukarıda verdiğim örnek görelim. Hayır işleri çok karıştırmak gerekiyor.

Ayrıca bakınız: Are PID-files still flawed when doing it 'right'?

Bu arada;PID bile daha kötü dosyaları ps ayrıştırma!Hiç bunu yapma.

  1. ps çok unportable. Hemen hemen her UNİX sistemi üzerinde bulurken; bağımsız değişkenleri ise standart olmayan çıktı isterseniz büyük ölçüde değişir. Ve standart çıktı dosyası ayrıştırma için insan tüketimi için değil!
  2. ps ayrıştırma yanlış pozitif bir SÜRÜ yol açar. ps aux | grep PID örnek alıyoruz, ve birisi ile cini baktın PID aynı oluyor bu argüman bir yere kadar bir dizi işlem başlatma düşünün artık! İki kişi bir X oturumu başlatmak ve X senin öldürmek için grepping düşünün. Sadece kötü her türlü.

Eğer bu işlemi kendiniz yönetmek istiyorsanız Eğer; işlemleri için bir monitör olarak hareket edecek, orada gayet iyi bir sistemleri var. Örneğin runit içine bak.

Bunu Paylaş:
  • Google+
  • E-Posta
Etiketler:

YORUMLAR

SPONSOR VİDEO

Rastgele Yazarlar

  • Christopher Bill

    Christopher

    30 NİSAN 2009
  • EmmightySofia

    EmmightySofi

    25 EYLÜL 2011
  • FILIPeeeK

    FILIPeeeK

    22 Mayıs 2006