PHP脚本作为守护进程

时间:2015-04-20 15:48:56

标签: linux bash shell daemon

我是php守护进程的新手。我使用以下脚本来触发Daemon.php脚本。但是我在通过shell

执行下面的bash脚本时遇到错误

错误是,

exit: 0RETVAL=0: numeric argument required 

请帮我解决此错误

#!/bin/bash
#
#   /etc/init.d/Daemon
#
# Starts the at daemon
#
# chkconfig: 345 95 5
# description: Runs the demonstration daemon.
# processname: Daemon

# Source function library.
#. /etc/init.d/functions

#startup values
log=/var/log/Daemon.log

#verify that the executable exists
test -x /home/godlikemouse/Daemon.php || exit 0RETVAL=0

#
#   Set prog, proc and bin variables.
#
prog="Daemon"
proc=/var/lock/subsys/Daemon
bin=/home/godlikemouse/Daemon.php
start() {
    # Check if Daemon is already running
    if [ ! -f $proc ]; then
        echo -n $"Starting $prog: "
        daemon $bin --log=$log
        RETVAL=$?
        [ $RETVAL -eq 0 ] && touch $proc
        echo
    fi

    return $RETVAL
}

stop() {
    echo -n $"Stopping $prog: "
    killproc $bin
    RETVAL=$?
    [ $RETVAL -eq 0 ] && rm -f $proc
    echo
        return $RETVAL
}

restart() {
    stop
    start
}   

reload() {
    restart
}   

status_at() {
    status $bin
}

case "$1" in
start)
    start
    ;;
stop)
    stop
    ;;
reload|restart)
    restart
    ;;
condrestart)
        if [ -f $proc ]; then
            restart
        fi
        ;;
status)
    status_at
    ;;
*)

echo $"Usage: $0 {start|stop|restart|condrestart|status}"
    exit 1
esac

exit $?
exit $RETVAL

2 个答案:

答案 0 :(得分:1)

此行产生错误:

test -x /home/godlikemouse/Daemon.php || exit 0RETVAL=0

如果要将RETVAL的值设置为0,首先需要删除0,因为您不能拥有以数字开头的变量。

然后从第二个语句中删除值集,以便在Daemon.php不存在时退出。

test -x /home/godlikemouse/Daemon.php || exit

您也可以删除启动和停止功能中的2个空回显语句,如无操作。

案例陈述中也有错误。您需要引用案例选项并删除最后一个退出块,因为exit $?将触发退出。

case "$1" in
"start")
    start
    ;;
"stop")
    stop
    ;;
"reload"|"restart")
    restart
    ;;
"condrestart")
        if [ -f $proc ]; then
            restart
        fi
        ;;
"status")
    status_at
    ;;

答案 1 :(得分:0)

此脚本中存在多个语法和逻辑错误。要突出几点:

  • echo $"Usage(应该只是echo "Usage ...",因为“..”中的字符串不是变量
  • 双重退出语句,$RETVAL的第二个语句永远不会运行。
  • exit 0RETVALexit $RETVAL不同,而且只应使用exit 1来表示错误,exit 0表示脚本正确运行
    • $prog已定义但从未使用过
    • test -x用于检查给定路径中是​​否启用了可执行位。测试文件时test -f更安全,测试目录更安全test -d,测试符号链接时test -L更安全。结合test -ftest -x以确保没有竞争条件或最差。 (例如:(test -f /home/godlikemouse/Daemon.php && test -x /home/godlikemouse/Daemon.php) || exit 1)

有关创建sysv init脚本的更多详细信息,请参阅http://refspecs.linuxbase.org/LSB_3.0.0/LSB-generic/LSB-generic/iniscrptact.html,并且可以在http://www.tldp.org/LDP/abs/html/index.html读取bash脚本。强烈建议在编写系统控制程序(如init脚本)之前先学习它们。