Python 기반 프로그램을 제어하려고 합니다(콘솔에서 분리되지 않음).
#!/bin/bash
user=nobody
pid=/var/run/xx.pid
name=xx
prog=/xx.py
case $1 in
start)
/sbin/start-stop-daemon --start -b --oknodo --user "$user" --name "$name" --pidfile "$pid" --startas "$prog" --chuid nobody -- --daemon
;;
stop)
/sbin/start-stop-daemon --stop --oknodo --user "$user" --name "$name" --pidfile "$pid" --retry=TERM/5/KILL/1
;;
restart)
;;
*)
;;
esac
시작 부분은 잘 작동합니다. 스크립트가 시작되고 실행되는 것은 볼 수 있지만 중지되는 부분은 볼 수 없습니다. 그냥 말한다No xx found running; none killed.
그럼 초반에 뭔가 문제가 있는 것 같은데요?
답변1
start-stop-daemon --start --pidfile "$pid"
( )를 지정하지 않으면 pid 파일이 기록되지 않습니다 --make-pidfile
. 존재하지 않는 -m
경우 --make-pidfile
시작된 프로그램이 이를 작성합니다. 또한 이것이 작동하려면 --make-pidfile
시작되는 프로세스가 포크를 통해 자체적으로 데몬화될 수 없습니다. 왜냐하면 start-stop-daemon
파일에 어떤 PID를 넣어야 하는지 알 수 없기 때문입니다.
사용 시나리오에서 수행할 수 있는 유일한 작업은 --pidfile "$pid"
프로그램이 이미 실행 중인 경우 시작에 실패하게 만드는 것입니다.start-stop-daemon
프로세스가 여전히 중지되지 않으면 전달된 모든 조건이 start-stop-daemon --stop
일치해야 합니다. 의미는 $pid
실행 중인 프로세스여야 하며 프로세스의 UID가 일치해야 하며 $user
프로세스 이름(arg0)이 일치해야 합니다 $name
.
arg0의 값은 다음과 같이 결정할 수 있습니다.ps h -p $pid -o comm