tmux 세션 내에서 데몬을 시작하는 upstart 스크립트를 작성했습니다. 잘 작동하고 예기치 않게 죽으면 프로세스를 다시 생성하지만 수동으로 중지 할 수없는 것 같습니다.
작업 (북킷)은 다음과 같습니다.
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"
내가 발행하면 stop bukkit
~ 10 초 동안 정지하고 (잠자기 타이머라고 생각합니다) 인쇄합니다 bukkit start/running, process 2391
. upstart를 디버그하도록 설정하면 로그에서 다음과 같은 관련 줄을 찾았습니다.
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가 프로세스를 중지하려고 할 때 프로세스가 계속 생성되는 이유는 무엇입니까?
답변
여기서 어려운 점은 프로세스가 중지하도록 지시하는 사전 중지 스크립트와 ‘재현’의 조합입니다. 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.
종료 상태가 0 인 상태로 종료하면 다시 생성되는지 여부에 대해서는 문서가 명확하지 않습니다. 그러나 기본적으로 목표가 ‘정지’일 때 종료되는 주요 프로세스가 ‘재발 성’으로 변경되어서는 안되기 때문에 시작 버그가 발견되었습니다.
이 버그를 해결하려면 “정상 종료”를 사용하여 upstart에 작업을 중지하는 일반적인 방법이며 다시 시작해서는 안된다는 것을 알 수 있어야합니다.
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
일반적으로 명령을 실행하는 사전 중지 프로세스 대신 신호 (필요한 경우 “킬 신호 N”지정)로 프로세스를 강제 종료하는 것이 더 강력합니다. 그러나 신호 수신시 서비스가 완전 종료를 지원하지 않는 경우에는 항상 이것이 가능하지는 않습니다.
답변
다른 사람이 여기에 오면 버그에 작동 패치를 제출했습니다.
답변
이 문제에 대한 픽스는 1.10에서 시작되었으므로 이제는 안됩니다.