2010-01-25 3 views
3

PID 파일을 사용하여 프로그램을 병렬 실행하지 못하게하는 데몬이 있습니다. 나는 시그널 핸들러를 SIGTERM을 잡아두고 PID 파일을 포함하여 필요한 클린업을하도록 설정했다. 이것은 "kill -s SIGTERM #PID"를 사용하여 테스트 할 때 훌륭하게 작동합니다. 그러나 서버를 재부팅 할 때 PID 파일은 여전히 ​​데몬 시작을 방지하기 위해 매달려 있습니다. 서버가 종료 될 때 SIGTERM이 모든 프로세스로 전송된다는 것을 이해합니다. 내 데몬에서 다른 신호 (SIGINT, SIGQUIT?)를 트래핑해야합니까?서버를 다시 시작한 후 데몬에 대해 PID 파일이 돌아가는 경우

답변

3

pidfile에 flock (또는 lockf)을 사용합니다. 성공하면 pidfile을 다시 쓰고 계속 진행할 수 있습니다.

This SO answer에는 이것이 수행되는 방법에 대한 좋은 예가 있습니다.

3

직접적인 해결책은 아니지만 시작시 pid 파일에서 실행중인 실제 프로세스를 확인하고 존재하지 않는 경우 오래된 파일을 정리하는 것이 좋습니다.

pid 파일을 정리하기 전에 프로세스가 SIGKILL을 받고있을 가능성이 있습니다.

+2

+1 : 전원이 끊어지면 프로세스가 신호를 보내지 않으며 같은 종류의 "일치하는 프로세스가없는 PID 파일"을 갖게됩니다. PID 파일을 찾는 것보다 더 나은 테스트가 명확하게 표시됩니다. –

+0

pid가 다른 프로세스에서 사용되면 데몬은 이미 실행 중이라고 생각하므로 보장 할 수 없습니다. – stinkypyper

+0

stinkypipe. pid와 double check가있는 프로세스의 이름을 항상 확인할 수 있습니다. 그것은 사소한 장애물입니다. –

2

모든 프로세스에 SIGTERM을 보낸 후에 커널은 약간의 시간 (일반적으로 약 2 또는 3 초) 기다린 다음 SIGKILL을 보냅니다. /etc/rc.d/rc0.d/S01halt 또는 유사 항목에서 찾을 수 있습니다 (배포에 따라 다를 수 있음). 당신은 충분히 빨리되지 않도록 경우

action $"Sending all processes the TERM signal..." /sbin/killall5 -15 
sleep 2 
action $"Sending all processes the KILL signal..." /sbin/killall5 -9 

을 어느 지연을 증가하거나 빠른 있는지 확인 :

예를 들어, 내 페도라 11에, 당신은!

관련 문제