我试图在 centos 6.9 中从 init.d 运行 php 脚本,当我退出启动服务的终端时,应用程序停止,并且应用程序的状态始终显示为已停止,即使它正在运行。
#!/bin/sh
#
# arrbot This shell script takes care of starting and stopping
# the arbbot
#
# chkconfig: - 65 20
# description: arbbot trader.
# processname: arbbot
# Required-Start: $network $syslog $mysqld
# Required-Stop: $network $syslog $mysqld
# Short-Description: start and stop arbbot server
# Description: arbbot trader
### END INIT INFO
# Source function library.
. /etc/rc.d/init.d/functions
NAME=arbbot
DESC="arbbot trader"
LOGFILE="/var/log/${NAME}.log"
DAEMON="/usr/bin/php5"
WORK_DIRECTORY="/var/www/arbbot/"
DAEMON_OPTS="/var/www/arbbot/main.php"
ARBDIR="/var/www/arbbot"
ARBBOT="exec ${DAEMON} ${DAEMON_OPTS} > ${LOGFILE} 2>&1 > NULL"
LOCK="/var/lock/subsys/arbbot"
start() {
echo -n "Starting ${DESC}: "
cd "${WORK_DIRECTORY}"
$ARBBOT
RETVAL=$?
[ $RETVAL -eq 0 ] && touch -- "$LOCK"
return $RETVAL
}
stop() {
echo -n "Shutting down arbbot: "
killproc $ARBBOT
rm -f $LOCK
return
}
restart() {
stop
start
}
reload() {
restart
}
case "$1" in
start)
start
echo "$NAME."
;;
stop)
stop
echo "$NAME."
;;
status)
status ARBBOT
RETVAL=$?
;;
restart)
restart
;;
reload)
reload
;;
*)
echo "Usage: {start|stop|status|reload|restart[|probe]"
exit 1
;;
esac
exit $RETVAL
答案1
守护进程有很多功能不适用于其他进程。它需要关闭其标准输出和标准输入,并且需要与控制进程分离,并且需要将其 cwd 设置为根(除其他事项外)。有最少的守护进程可以充当运行正常进程的控制进程就好像它们是守护进程一样- 例如守护进程
您可能还需要自定义信号处理和(如果您需要任何诊断/审计功能)日志记录功能。
然而,使用 POSIX 扩展,所有必需的功能都会公开 - 所以您可以setid() 和 fork()从您自己的代码中 - 或者甚至只是下载一些预先编写的 php 代码为你做这一切。
注意:有很多人在互联网上发布代码和建议,这是错误的 - 但他们发现它对他们有用 - 我上面链接的代码是更好的实现之一。
答案2
我建议你阅读将 php 脚本作为守护进程运行 。
另外,关于像原始系统守护进程一样编写 php 守护进程的更详细描述 -如何编写 PHP 守护进程。