我正在尝试控制一个基于 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"
除非指定--make-pidfile
( ) ,否则不会写入 pid 文件。-m
如果没有--make-pidfile
它,则由启动的程序来创建它。另外,为了--make-pidfile
正常工作,正在启动的进程无法自行守护进程(通过 fork),因为这样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