Linux
從 init 執行一個 php 文件
我正在嘗試從 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
我建議您閱讀Run php script as daemon process。
此外,關於像原始系統守護程序一樣編寫 php 守護程序的更詳細描述 -如何編寫 PHP 守護程序。
守護程序有很多特性不適用於其他程序。它需要關閉它的標準輸出和標準輸入,它需要與控制程序分離,它需要將它的 cwd 設置為 root(除其他外)。有最少的守護程序可以充當控制程序來執行正常程序,就好像它們是守護程序一樣- 例如daemonize
您可能還需要自定義信號處理和(如果您需要任何診斷/審計功能)日誌記錄功能。
然而,使用 POSIX 擴展,所有必需的函式都暴露出來了——因此您可以在自己的程式碼中設置id() 和 fork(),甚至只需下載一些預先準備好的 php 程式碼來為您完成所有這些工作。
當心:有很多人在網際網路上發布程式碼和建議是錯誤的 - 但他們發現它對他們有用 - 我上面連結的程式碼是更好的實現之一。