Php 作为守护进程的脚本

Php script as 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 "" in
start)
    start
    ;;
stop)
    stop
    ;;
reload|restart)
    restart
    ;;
condrestart)
        if [ -f $proc ]; then
            restart
        fi
        ;;
status)
    status_at
    ;;
*)

echo $"Usage: [=12=] {start|stop|restart|condrestart|status}"
    exit 1
esac

exit $?
exit $RETVAL

此行产生错误:

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

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

然后从第二条语句中删除值集,以便在 Daemon.php 不存在的情况下退出。

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

您还可以删除启动和停止函数中的 2 个空 echo 语句,因为什么都不做。

case语句也有错误。您需要引用大小写选项,并且可以删除最后一个退出块,因为 exit $? 将在之前触发退出。

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

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

  • 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 and bash scripting can be read at http://www.tldp.org/LDP/abs/html/index.html。强烈建议在编写系统控制程序(如 init 脚本)之前学习两者。