Bir Python betiğini arka planda nasıl çalıştırırım ve bir kilitlenmeden sonra nasıl yeniden başlatırım?


10

Her zaman Ubuntu 12.04 sunucumda çalıştırmak istediğim çok basit bir Python betiğim var. Ben uptart + monit kullanmayı düşündüm. Sorun şu ki, bu araçlar benim gibi basit bir ölümlü için oldukça karmaşık görünüyor ve web'de basit bir örnek bulamıyorum.

Uptart + Monit Aşırılık mı? Birisi daha basit bir alternatif veya uptart + monit için iyi bir öğretici biliyor mu? Sadece betiğin her zaman çalıştığından emin olmak istiyorsam, monit gerekli midir?


Referans olarak, tam olarak aynı soru burada soruldu: superuser.com/q/461546/786969
PHPirate

Yanıtlar:


16

Bunu yapmanın en basit yolu bunu şuraya yerleştirmektir /etc/init/something.conf:

start on runlevel [2345]
stop on runlevel [016]

respawn
exec python /path/to/your/script.py

Yeniden doğma, öldürülürse veya sıfırdan çıkarsa (yakalanmamış bir istisna gibi) yeniden başlayacaktır. Bu Ubuntu 10.04'e geri dönecek.

Eğer 12.04 varsa daha fazla fantezi alabilirsiniz. Yukarıdaki komut dosyasında root olarak çalışacaktır. 12.04'te setuid / setgid ekleyebilirsiniz:

start on runlevel [2345]
stop on runlevel [016]

respawn
setuid nobody
setgid nogroup
exec python /path/to/your/python.py

Komut dosyanız kullanılabilir bir ağ olmadığında çıkarsa ve dengesiz bir ağ bağlantısında çalıştırmayı planlıyorsanız, bunu düzeltmeli ve hayatta kalmasını / yeniden denemesini sağlamalısınız. Ancak yapamıyorsanız, bir ağ cihazı her çıktığında manuel olarak başlatmanız gerekebilir. Böylece bunu yerleştirebilirsiniz /etc/network/if-up.d/yourscript(chmod + x ile çalıştırılabilir yapın)

#!/bin/sh
exec start wait-for-state WAITER=$IFACE-yourscript WAIT_FOR=something

Komut dosyanızın bu belirli komut dosyasına yalnızca keyfi ve benzersiz bir şey olduğu ve "bir şeyin" iş adıyla aynı olduğu ( /etc/init/something.confdaha önce önerilen gibi).


Evet! Yani bu upstartdoğru mu? Bu, komut dosyasının önyüklemede de başlatılacağı anlamına mı geliyor (bu harika olurdu!)? Ve respawnkurmanıza gerek kalmayacak kadar mı yeterli monit?
sebpiq

Evet, 'çalışma seviyesinde başlat [2345]', sistemin "çok kullanıcılı moda" girdiği zaman anlamına gelir. Uzun vadede, çok eski unixy "runlevel" i "ağ hizmetlerini başlatmaya başla" ve "ağ hizmetlerini durdurmayı durdur" gibi şeylerle değiştirmeyi planlıyor, böylece daha mantıklı bir şekilde okunuyor.
SpamapS

Harika! Tam olarak ihtiyacım olan şey çok teşekkürler.
sebpiq

2

Eski günlerdeki olağan yaklaşım, zaman damgası veya işlem kimliği içeren bir dosya yazmak /tmpve daha sonra bu işlem kimliğinin hala çalışıp çalışmadığını veya zaman damgasının hala güncel olup olmadığını sırasıyla denetlemekti.

Ayrıca, while [ 1 ]; do phyton-script.ph; donedönmesi durumunda betiği yeniden başlatacak basit bir işlem yapabilirsiniz .

Daha fazla olasılık için lütfen betiğiniz hakkında daha fazla bilgi sağlayın. Özellikle neden beklenmedik şekilde çıkmasını veya çökmesini beklediğiniz konusunda.


betik sadece bir akış API'sı kullanarak twitter tweets hurdaya. Temel olarak, tweet'lerin itilmesini, bazı kodların yürütülmesini ve tekrar beklemeye sonsuz bir döngü var. Bunun endişelenmeden çalışmasını istiyorum ... bir hata varsa ve çökerse, vb ...
sebpiq

Sizinkine benzer bir cevap (kabul ettiğim): superuser.com/questions/461546/…
sebpiq

Ayrıca betiğin çalışıp çalışmadığını kontrol etmek için bir cron işi iyi bir fikir olabilir.
con-f-use
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.