start-stop-daemon检查现有的运行进程

我正在启动一个使用start-stop-daemon创build的Python脚本。 除非我忘记已经开始,否则它在任何情况下都是完美的。 它创build一个新的进程,但无法自动杀死旧的进程。

以下是完整的脚本:

 PYTHONPATH=/usr/lib/python2.4 # path to app APP_PATH=/var/spool/EARS # path to paster bin DAEMON=/var/spool/EARS/pymilter_test8.py # startup args #DAEMON_OPTS=" serve --log-file <my logfile> --server-name=main production.ini" # script name NAME=EARS_milter.sh # app name DESC='EARS_milter' # pylons user RUN_AS=postfix PID_FILE=/var/run/milter.pid ############### END EDIT ME ################## test -x $DAEMON || exit 0 set -e case "$1" in start) echo -n "Starting $DESC: " start-stop-daemon -d $APP_PATH -c $RUN_AS --start --background --pidfile $PID_FILE --make-pidfile --exec $DAEMON -- $DAEMON_OPTS echo "$NAME." ;; stop) echo -n "Stopping $DESC: " start-stop-daemon --stop --pidfile $PID_FILE echo "$NAME." ;; restart|force-reload) echo -n "Restarting $DESC: " start-stop-daemon --stop --pidfile $PID_FILE sleep 1 start-stop-daemon -d $APP_PATH -c $RUN_AS --start --background --pidfile $PID_FILE --make-pidfile --exec $DAEMON -- $DAEMON_OPTS echo "$NAME." ;; *) N=/etc/init.d/$NAME echo "Usage: $N {start|stop|restart|force-reload}" >&2 exit 1 ;; esac exit 0 

有没有办法检查? 到目前为止,我已经尝试了-S开关没有运气。

谢谢。

$PID_FILE将只包含你启动的最新实例的进程ID,所以只有这个实例会被杀死。

你可以做的一件事是解决这个问题,就是grep你的守护进程正在运行的实例的PID,并用kill终止它们。

…或者只是在调用start-stop-daemon之前检查脚本是否有另一个正在运行的实例。

生成并运行的是Python解释器,但是start-stop-daemon检查名为pymilter_test8.py的进程,显然找不到它。

我最近在使用start-stop-daemon数据库服务器(Crate)时遇到了一个问题。 数据库是用一个bash脚本启动的,然后在单独的进程中启动java 。 这是一个问题,因为实际的服务器总是被列在第二个PID之下。 当我让服务器自己创buildPID文件时,我发现start-stop-daemon在使用--pidfile参数时仍然不能识别服务器已经在运行。 但是,当我使用--startas而不是--exec作为开始调用时,它似乎为我解决了一些问题,而start-stop-daemon能够正确地pipe理服务器进程。

你必须确保至lessPID文件是正确的分叉服务器,就像我使用一个不同的运行PID比启动它的进程。 在debugging时,使用-t标志是有帮助的,因为您可以在每种情况下手动运行start-stop-daemon命令并监视它将执行的操作。

您可以在/var/lock使用locking文件。 守护进程在启动之前检查locking文件,如果locking文件存在,则会失败,并显示错误。 如果没有失败,则会创buildlocking文件。 这样,两个实例不能同时运行。

唯一的问题是,如果它没有清理它的混乱的能力崩溃,你必须手动删除locking文件。 不是一个大问题。 locking文件位置应该在启动失败时创build的错误消息中。

在开始的情况下,你会把这样的东西:

 if [ -f /var/lock/filename.lck ]; then echo "Lock file already present at /var/lock/filename.lck. Aborting" exit 1 else touch /var/lock/filename.lck fi 

然后在停止的情况下,这样的事情:

 if [ -f /var/lock/filename.lck ]; then rm /var/lock/filename.lck fi 

它涉及编辑超出正常的configuration编辑部分,但它应该工作。