使用 start-stop-daemon 终止脚本的正确方法是什么?
What is the proper way to terminate a script using start-stop-daemon?
我正在使用启动停止守护进程为我的脚本制作一个 INIT 脚本。我正在使用 --make-pidfile
因为我的脚本没有创建自己的 pid。我可以使用 start 启动我的脚本,并使用适当的 PID 生成 pid 文件。但是停止功能不起作用。我得到 return 代码 0 带 --oknodo
和 1 没有它。如果我这样做
ps -ef | grep perl
和
cat /home/me/mydaemon/run
我总是看到相同的 PID。我可以使用
终止脚本
kill -15 PID.
但我的初始化脚本的停止功能没有。
停止我的进程的正确方法是什么?
根据 start-stop-daemon 手册,
--stop Checks for the existence of a specified process. If such a process exists, start-stop-daemon sends it the signal specified by
--signal, and exits with error status 0. If such a process does not exist, start-stop-daemon exits with error status 1 (0 if --oknodo
is specified). If --retry is specified, then start-stop-daemon
will check that the process(es) have terminated.
我没有找到 --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 "" 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
;;
问题出在我用于匹配进程名称的 --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。现在我可以正确地停止我的进程了。
我正在使用启动停止守护进程为我的脚本制作一个 INIT 脚本。我正在使用 --make-pidfile
因为我的脚本没有创建自己的 pid。我可以使用 start 启动我的脚本,并使用适当的 PID 生成 pid 文件。但是停止功能不起作用。我得到 return 代码 0 带 --oknodo
和 1 没有它。如果我这样做
ps -ef | grep perl
和
cat /home/me/mydaemon/run
我总是看到相同的 PID。我可以使用
终止脚本kill -15 PID.
但我的初始化脚本的停止功能没有。
停止我的进程的正确方法是什么?
根据 start-stop-daemon 手册,
--stop Checks for the existence of a specified process. If such a process exists, start-stop-daemon sends it the signal specified by --signal, and exits with error status 0. If such a process does not exist, start-stop-daemon exits with error status 1 (0 if --oknodo is specified). If --retry is specified, then start-stop-daemon will check that the process(es) have terminated.
我没有找到 --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 "" 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
;;
问题出在我用于匹配进程名称的 --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。现在我可以正确地停止我的进程了。