【问题标题】:php and error "start-stop-daemon: unable to stat"php 和错误“启动-停止-守护进程:无法统计”
【发布时间】:2013-08-27 20:55:15
【问题描述】:

我有一个使用 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"
}

【问题讨论】:

    标签: php linux daemon start-stop-daemon


    【解决方案1】:

    再次查看 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
    

    【讨论】:

      【解决方案2】:

      来发现问题与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"
      }
      

      【讨论】:

        【解决方案3】:

        多斯特兰德,

        感谢这个发布。它帮助我解决了我遇到的一些问题。但我想知道是否

        do_stop()       
        

        {
        启动-停止-守护进程 --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 锁定文件存在

        我在 /lib/lsb/init-functions 中找不到 killproc() 会返回 2 的任何地方。

        而 4 表示程序或服务状态未知

        【讨论】:

          猜你喜欢
          • 2013-03-06
          • 2012-09-05
          • 2012-01-24
          • 1970-01-01
          • 2010-11-10
          • 2013-11-08
          • 2015-10-07
          • 2014-11-01
          • 1970-01-01
          相关资源
          最近更新 更多