Uptart neden süreçimi yeniden doğurmaya devam ediyor?


19

Bir tmux oturumu içinde bir daemon başlatmak için bir uptart komut dosyası yazdım. İyi çalışıyor ve beklenmedik bir şekilde ölürse süreci yeniden doğurur, ancak manuel olarak durduramıyorum.

Bukkit denilen iş şöyle görünür:

start on filesystem
stop on runlevel [!2345]

respawn
respawn limit 5 30

chdir /home/minecraft/bukkit

expect daemon
kill timeout 30

pre-start script
    test -x /home/minecraft/bukkit/craftbukkit-0.0.1-SNAPSHOT.jar || { stop; exit 0; }
end script

pre-stop script
    tmux send -t bukkit "stop"
    tmux send -t bukkit "Enter"
    sleep 10  # Wait for server to shut down properly
end script

exec tmux new-session -d -s minecraft -n bukkit "sudo -u minecraft -- /home/minecraft/java/jre1.6.0_27/bin/java -Xincgc -Xmx1G -jar /home/minecraft/bukkit/craftbukkit-0.0.1-SNAPSHOT.jar"

Bir sorun stop bukkitçıkardığımda ~ 10 saniye (uyku zamanlayıcısı, sanırım) donuyor ve yazdırılıyor bukkit start/running, process 2391. Uptart'ı hata ayıklamak için ayarladığımda, günlükte şu ilgili satırları buldum:

Sep 21 19:14:59 cheftest init: bukkit goal changed from start to stop
Sep 21 19:14:59 cheftest init: bukkit main process (2499) exited normally
Sep 21 19:14:59 cheftest init: bukkit main process ended, respawning
Sep 21 19:14:59 cheftest init: bukkit goal changed from stop to respawn

Upstart, işlemi durdurması gerektiğinde neden yeniden doğmaya devam ediyor?

Yanıtlar:


23

Buradaki zorluk 'yeniden doğma' sürecinin durmasını söyleyen bir durma öncesi komut dosyası ile birleşimidir. İnit'ten (5):

   respawn
         A service or task with this stanza will be automatically started
         if it should stop abnormally.  All reasons for a service stopping,
         except the stop(8) command itself, are considered abnormal.  Tasks
         may exit with a zero exit status to prevent being respawned.

Sıfır çıkış durumundan çıkmanın yeniden doğmaya neden olup olmayacağı konusunda dokümantasyon biraz belirsizdir. Ancak, temelde bir başlangıç ​​hatası buldunuz çünkü hedef 'dur' olduğunda sona eren ana süreç 'yeniden doğma' ile ilgili bir değişikliğe neden olmamalıdır.

Bu hataya geçici bir çözüm bulmak için, "normal çıkış" ı kullanabilmeniz gerekir.

  normal exit STATUS|SIGNAL...
         Additional exit statuses or even signals may be added, if the
         job process terminates with any of these it will not be considered
         to have failed and will not be respawned.

         normal exit 0 1 TERM HUP

Genel olarak, işlemi komutları veren bir durdurma öncesi işlem yerine bir sinyalle (gerekirse "öldürme sinyali N" belirterek) öldürmenin daha sağlam olacağını unutmayın; ancak servis sinyal alındıktan sonra temiz kapatmayı desteklemiyorsa bu her zaman mümkün değildir.


Teşekkür ederim, bu çözüm benim durumum için mükemmel çalışıyor. Bunun için bir hata raporu buldum , ancak bu davranışın aslında bilinçli olarak tasarlandığı anlaşılıyor.
passy

Scott James Remnant'ın cevabı doğru olanı var - bir hata değil, bir tasarım kararı değil, atıfta bulunulan test vakası başka bir şeyi test
etmeyi amaçlıyor


2

Bunun için bir başlangıç ​​1.10'da bir düzeltme yayınlandı, bu yüzden şimdi olmamalı.


Bu soruya bir cevap sağlamaz. Bir yazardan eleştiri veya açıklama istemek için gönderilerinin altına bir yorum bırakın.
amc

2
Bundan tam olarak emin değilim. Cevabım şu anlama gelir: Bunun nedeni, hataya sahip eski bir uptart sürümü kullanmanız, düzeltmek için 1.10 veya daha yeni bir sürüm kullanmanızdır. Diğer yanıtların hiçbirinin belirtmediği bir şey ve aslında düzeltmenin yayınlandığına dair en faydalı cevap ve geçici bir çözüm için çok az neden var.
cprcrack

Yararlı olduğunu kabul ediyorum, ancak kabul edilen cevaba bir yorum olarak daha yararlı olduğunu düşünüyorum
amc
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.