Tại sao mới bắt đầu tiếp tục quá trình của tôi?


19

Tôi đã viết một kịch bản mới nhất để khởi chạy một trình nền trong phiên tmux. Nó hoạt động tốt và đáp ứng quá trình nếu nó chết đột ngột, nhưng tôi dường như không thể dừng nó bằng tay.

Công việc (được gọi là bukkit) trông như thế này:

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"

Khi tôi phát hành, stop bukkitnó sẽ đóng băng trong ~ 10 giây (đồng hồ ngủ, tôi đoán vậy) và in bukkit start/running, process 2391. Khi tôi thiết lập để bắt đầu gỡ lỗi, tôi đã tìm thấy những dòng có liên quan trong nhật ký:

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

Tại sao mới bắt đầu tiếp tục quá trình của tôi khi nó được yêu cầu dừng nó?

Câu trả lời:


23

Khó khăn ở đây là sự kết hợp giữa 'hồi sinh' với một kịch bản trước khi dừng cho biết quá trình dừng lại. Từ 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.

Tài liệu này không rõ ràng một chút về việc liệu thoát ra với trạng thái thoát không có gây ra sự hồi sinh hay không. Tuy nhiên, về cơ bản, bạn đã tìm thấy một lỗi mới vì quy trình chính kết thúc khi mục tiêu là 'dừng lại' không nên dẫn đến thay đổi thành 'hồi sinh'.

Để khắc phục lỗi này, bạn nên có thể sử dụng "lối ra bình thường" để nói với bạn rằng đây là một cách bình thường để dừng công việc và nó không nên hồi sinh.

  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

Lưu ý rằng, nói chung, sẽ mạnh mẽ hơn để tiêu diệt quá trình bằng tín hiệu (chỉ định "tín hiệu tiêu diệt N" nếu cần thiết) thay vì với quy trình trước khi dừng phát lệnh; nhưng tất nhiên điều này không phải lúc nào cũng có thể nếu dịch vụ không hỗ trợ tắt máy sạch khi nhận được tín hiệu.


Cảm ơn bạn, công việc xung quanh hoạt động hoàn hảo cho trường hợp của tôi. Tôi đã tìm thấy một báo cáo lỗi cho việc này, nhưng có vẻ như hành vi này thực sự được thiết kế có ý thức.
passy

Câu trả lời của Scott James Remnant có câu trả lời đúng - đó là một lỗi, không phải là quyết định thiết kế, trường hợp thử nghiệm được đề cập là để kiểm tra một cái gì đó khác :)
slangasek


2

Một bản sửa lỗi đã được phát hành vào lúc 1.10 cho việc này, vì vậy bây giờ nó không nên xảy ra.


Điều này không cung cấp một câu trả lời cho câu hỏi. Để phê bình hoặc yêu cầu làm rõ từ một tác giả, hãy để lại nhận xét bên dưới bài đăng của họ.
amc

2
Tôi không hoàn toàn chắc chắn về điều đó. Câu trả lời của tôi tương đương với câu nói: Điều đó xảy ra bởi vì bạn đang sử dụng phiên bản cũ mới bắt đầu có lỗi, sử dụng phiên bản 1.10 hoặc mới hơn để sửa lỗi. Một cái gì đó mà không có câu trả lời nào khác nêu ra, và thực sự là câu trả lời hữu ích nhất hiện nay rằng bản sửa lỗi đã được phát hành và có rất ít lý do cho một cách giải quyết.
cprcrack

Tôi đồng ý nó hữu ích nhưng tôi nghĩ nó hữu ích hơn khi bình luận cho câu trả lời được chấp nhận
amc
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.