我有一个使用php创建的守护进程。我希望通过initscripts调用它,并让它在启动时启动,这很好。但是,当我尝试使用
杀死进程时sudo service crystal_send stop
它不会杀死这个过程。
当我直接打电话时
start-stop-daemon --stop --quiet --retry=TERM/30/KILL/5 --pidfile /var/run/crystal/crystal_send.pid --exec /bin/crystal_send
我得到了
start-stop-daemon: unable to stat /bin/crystal_send (No such file or directory)
这是我的/etc/init.d/crystal_send do_stop函数的样子。
## /etc/init.d/crystal_send
NAME=crystal_send
DAEMON=/bin/$NAME
PIDFILE=/var/run/crystal/$NAME.pid
....
do_stop()
{
start-stop-daemon --stop --quiet --retry=TERM/30/KILL/5 --pidfile $PIDFILE --exec $DAEMON
RETVAL="$?"
rm -f $PIDFILE
[ "$RETVAL" = 2 ] && return 2
start-stop-daemon --stop --quiet --oknodo --retry=0/30/KILL/5 --exec $DAEMON
[ "$?" = 2 ] && return 2
rm -f $PIDFILE
return "$RETVAL"
}
答案 0 :(得分:0)
好了来发现问题与start-stop-daemon --stop有关,特别是
--exec $DAEMON
部分不是我应该使用的,我应该一直在使用
--name $NAME
。
这是因为--exec正在寻找一个命令而守护进程是用php(一种解释语言)编写的,因此它实际上是在调用php,然后调用我的php程序(crystal_send),因为start-stop-daemon正在寻找一个命令/bin/crystal_send
而不是/bin/php /bin/crystal_send
它找不到它。
因此你应该让start-stop-daemon在进程表中查找名称,这就是我在使用--name $ NAME时所做的事情。
所以我的最终do_stop函数看起来像这样
## /etc/init.d/crystal_send
NAME=crystal_send
DAEMON=/bin/$NAME
PIDFILE=/var/run/crystal/$NAME.pid
....
do_stop()
{
start-stop-daemon --stop --quiet --retry=TERM/30/KILL/5 --pidfile $PIDFILE --name $NAME
RETVAL="$?"
rm -f $PIDFILE
[ "$RETVAL" = 2 ] && return 2
start-stop-daemon --stop --quiet --oknodo --retry=0/30/KILL/5 --name $NAME
[ "$?" = 2 ] && return 2
rm -f $PIDFILE
return "$RETVAL"
}
答案 1 :(得分:0)
dostrander,
非常感谢。它帮助我解决了我遇到的一些问题。但我想知道是否
do_stop()
{
start-stop-daemon --stop --quiet --retry = TERM / 30 / KILL / 5 --pidfile $ PIDFILE --name $ NAME
RETVAL = “$?”
rm -f $ PIDFILE
[“$ RETVAL”= 4]&&返回4
start-stop-daemon --stop --quiet --oknodo --retry=0/30/KILL/5 --name $NAME
[ "$?" = 4 ] && return 4
rm -f $PIDFILE
rm -f /var/lock/$NAME
return "$RETVAL"
}
会更好吗?
不是2表示程序已死并且/ var / lock lock file存在
另外我在/ lib / lsb / init-functions中找不到killproc()会返回2。
4意味着程序或服务状态未知
答案 2 :(得分:0)
在再次查看dostrander的代码和我的代码之后,我意识到,如果对start-stop-daemon的调用成功,那么在任何情况下都不会删除pidfile或lockfile。在调用start-stop-daemon之前删除它们可能更好。但在检查PID是否正确后。
if [ $(sed -n '1p' < $PIDFILE) == $(pidof -x $NAME) ]; then
rm -f $PIDFILE
rm -f $LOCKFILE
fi
start-stop-daemon -K -q --retry=TERM/30/KILL/5 -n $NAME
RETVAL="$?"
printf "RETVAL is $RETVAL.\n"
[ "$RETVAL" = 4 ] && return 4