使用start-stop-daemon终止脚本的正确方法是什么?

时间:2015-07-15 18:31:04

标签: bash start-stop-daemon

我正在使用start-stop-daemon为我的脚本创建一个INIT脚本。我正在使用--make-pidfile因为我的脚本没有制作自己的pid。我可以使用start和pid文件生成具有适当PID的脚本。但是停止功能不起作用。我收到--oknodo的返回码0和没有它的1。如果我做

ps -ef | grep perl

cat /home/me/mydaemon/run

我总是看到相同的PID。我可以使用

终止脚本
kill -15 PID. 

但不是我的init脚本的停止功能。

停止进程的正确方法是什么?

根据start-stop-daemon手册,

  

- stop检查是否存在指定的进程。如果存在这样的进程,start-stop-daemon会向其发送指定的信号   --signal,并以错误状态0退出。如果这样的进程不存在,则start-stop-daemon以错误状态1退出(如果--oknodo为0)   已指定)。如果指定了--retry,那么start-stop-daemon   将检查过程是否已经终止。

我没找到--signal本身的任何文档。如果我想发送SIGTERM,如何指定--signal

#!/bin/sh
### BEGIN INIT INFO
# Provides:          myd
# Required-Start:    $local_fs $network $named $time $syslog
# Required-Stop:     $local_fs $network $named $time $syslog
# Default-Start:     2 3 4 5
# Default-Stop:      0 1 6
# Description:       Diitalk daemon for sending push notifications
### END INIT INFO

. /lib/lsb/init-functions

PATH=/sbin:/bin:/usr/sbin:/usr/bin
DAEMON="/home/me/mydaemon/myd"
NAME="myd"
DESC="My Daemon"
HOMEDIR=/home/me/mydaemon/run
PIDFILE="$HOMEDIR/$NAME.pid"
USER=me
GROUP=me
SHM_MEMORY=64
PKG_MEMORY=8
DUMP_CORE=no

case "$1" in
  start|debug)
        log_daemon_msg "Starting $DESC: $NAME"
        start-stop-daemon --start --quiet --background --make-pidfile --pidfile $PIDFILE \
                --exec $DAEMON || log_failure_msg " already running"
        log_end_msg 0
        ;;
  stop)
        log_daemon_msg "Stopping $DESC: $NAME"
        start-stop-daemon --oknodo --stop --quiet --pidfile $PIDFILE \
                --exec $DAEMON
        echo $?
        log_end_msg 0
        ;;

1 个答案:

答案 0 :(得分:1)

问题在于我用于匹配进程名称的--exec。根据start-stop-daemon文档:

   -x, --exec executable
          Check  for  processes  that  are  instances  of  this executable
          (according to /proc/pid/exe).

在我的情况下,由于我的脚本是Perl脚本,/ proc / pid / exe符号链接到/ usr / bin / perl;因此exec无法匹配进程名称。我删除了exec,使其仅匹配PID。现在我可以正确地停止我的过程。