upstart가 왜 프로세스를 다시 생성합니까?


19

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가 프로세스를 중지하려고 할 때 프로세스가 계속 생성되는 이유는 무엇입니까?

답변:


23

여기서 어려운 점은 프로세스가 중지하도록 지시하는 사전 중지 스크립트와 '재현'의 조합입니다. 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"지정)로 프로세스를 강제 종료하는 것이 더 강력합니다. 그러나 신호 수신시 서비스가 완전 종료를 지원하지 않는 경우에는 항상 이것이 가능하지는 않습니다.


고맙습니다. 그 해결 방법은 제 경우에 완벽하게 작동합니다. 이에 대한 버그 보고서 를 찾았 지만 실제로는이 동작이 의도적으로 설계된 것 같습니다.
passy

스콧 제임스 렘넌트의 대답은 올바른 일이 - 그것은 버그가 아닌 디자인 결정이다, 테스트 케이스 : 다른 테스트 뭔가 의미 언급
slangasek


2

이 문제에 대한 픽스는 1.10에서 시작되었으므로 이제는 안됩니다.


이것은 질문에 대한 답변을 제공하지 않습니다. 저자에게 비평을하거나 설명을 요청하려면 게시물 아래에 의견을 남겨주십시오.
amc

2
나는 그것을 완전히 확신하지 못한다. 내 대답은 말하는 것과 같습니다. 버그가있는 이전 버전의 upstart를 사용하고 있기 때문에 발생합니다. 버전 1.10 이상을 사용하여 문제를 해결하십시오. 다른 답변 중 어느 것도 언급하지 않았으며 실제로 가장 유용한 답변은 이제 수정 프로그램이 릴리스되었으며 해결 방법이 거의 없습니다.
cprcrack

나는 그것이 유용하다는 데 동의하지만 그것이 받아 들여진 답변에 대한 주석으로서 더 유용하다고 생각합니다
amc
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.