Mengapa pemula mulai respawning proses saya?

19

Saya menulis skrip pemula untuk meluncurkan daemon di dalam sesi tmux. Ini bekerja dengan baik dan respawn proses jika mati tiba-tiba, tetapi saya tidak bisa menghentikannya secara manual.

Pekerjaan (disebut bukkit) terlihat seperti ini:

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"

Ketika saya mengeluarkannya stop bukkitmacet selama ~ 10 detik (pengatur waktu tidur, saya kira) dan mencetak bukkit start/running, process 2391. Ketika saya mulai pemula untuk debug, saya menemukan baris yang relevan di log:

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

Mengapa pemula tetap respawn proses saya ketika seharusnya menghentikannya?

Passy
sumber

Jawaban:

23

Kesulitan di sini adalah kombinasi 'respawn' dengan skrip pre-stop yang memberitahukan proses untuk berhenti. Dari init (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.

Dokumentasi sedikit tidak jelas tentang apakah keluar dengan status keluar nol harus menyebabkan respawn. Namun, pada dasarnya Anda telah menemukan bug pemula karena proses utama yang berakhir ketika tujuannya adalah 'berhenti' seharusnya tidak menghasilkan perubahan menjadi 'respawn'.

Untuk mengatasi bug ini, Anda harus dapat menggunakan "jalan keluar normal" untuk memberi tahu pemula bahwa ini adalah cara normal untuk menghentikan pekerjaan dan tidak seharusnya respawn.

  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

Perhatikan bahwa secara umum, akan lebih kuat untuk mematikan proses dengan sinyal (menentukan "kill sinyal N" jika perlu) daripada dengan proses pra-stop yang mengeluarkan perintah; tetapi tentu saja ini tidak selalu mungkin jika layanan tidak mendukung shutdown bersih setelah menerima sinyal.

slangasek
sumber
Terima kasih, penyelesaian itu bekerja dengan baik untuk kasus saya. Saya menemukan laporan bug untuk ini, tetapi tampaknya perilaku ini sebenarnya dirancang secara sadar.
passy
Jawaban Scott James Remnant ada yang benar - itu adalah bug, bukan keputusan desain, kasus uji dimaksud dimaksudkan untuk menguji sesuatu yang lain :)
slangasek
3

Jika ada orang lain yang berakhir di sini, saya telah mengirimkan patch yang berfungsi ke bug:

https://bugs.launchpad.net/upstart/+bug/568288/comments/6

adamel
sumber
Selamat Datang di Tanya Ubuntu! Sementara ini secara teoritis dapat menjawab pertanyaan, akan lebih baik untuk memasukkan bagian-bagian penting dari jawaban di sini, dan menyediakan tautan untuk referensi.
Peachy
2

Perbaikan dirilis pada pemula 1,10 untuk ini, jadi sekarang seharusnya tidak terjadi.

cprcrack
sumber
Ini tidak memberikan jawaban untuk pertanyaan itu. Untuk mengkritik atau meminta klarifikasi dari penulis, tinggalkan komentar di bawah posting mereka.
amc
2
Saya tidak sepenuhnya yakin akan hal itu. Jawaban saya sama dengan mengatakan: Itu terjadi karena Anda menggunakan versi pemula baru yang memiliki bug, gunakan versi 1.10 atau lebih baru untuk memperbaikinya. Sesuatu yang tidak ada jawaban lainnya yang menyatakan, dan sebenarnya jawaban yang paling berguna sekarang setelah perbaikannya dirilis dan hanya ada sedikit alasan untuk menyelesaikannya.
cprcrack
Saya setuju ini berguna tetapi saya pikir ini lebih berguna sebagai komentar untuk jawaban yang diterima
amc