【问题标题】:What is the proper way to terminate a script using start-stop-daemon?使用 start-stop-daemon 终止脚本的正确方法是什么?
【发布时间】:2015-10-04 23:05:52
【问题描述】:

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

ps -ef | grep perl

cat /home/me/mydaemon/run

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

终止脚本
kill -15 PID. 

但不是我的初始化脚本的停止功能。

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

根据 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
        ;;

【问题讨论】:

  • --signal 的参数将是信号名称 (TERM) 或信号编号 (15) 我假设但手册页似乎表明 TERM 是默认值。那里的停止命令不起作用怎么办?该调用的返回码是什么?
  • 我用 --oknodo 得到 0
  • 没有--oknodo? 1?你的进程还在运行吗? pidfile中的pid是否正确?
  • 是的,有和没有 --oknodo 我的进程仍然运行。我检查了我的 pid 文件,它总是包含正确的 pid(我的脚本的 pid)。我可以使用 kill -15 虽然 终止我的脚本
  • 您的守护进程是使用$DAEMON 中的名称运行还是执行/fork/等。并改名?如果您使用−−test 运行,它说它会做什么?在通话中添加--verbose 有什么用吗?

标签: bash start-stop-daemon


【解决方案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。现在我可以正确地停止我的进程了。

【讨论】:

  • 从理论上讲,纯粹使用 pid 是不安全的。您可能应该使用-x /usr/bin/perl 或类似的东西,至少尝试确定您正在杀死的东西是正确的。
猜你喜欢
  • 2013-04-14
  • 1970-01-01
  • 2014-10-25
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2022-01-22
  • 2016-07-03
相关资源
最近更新 更多