守護進程(daemon)是一種特殊的進程,它的生命週期很長,它在後臺運行而且沒有控制終端(這樣能夠保證守護進程不會接收到各類來自終端的信號)。
好比:crontab、sshd、nginx等,都會使用守護進程的形式運行,確保能夠一直正常的提供服務。php
/** * daemon(守護進程) PHP實現 * @author zhjx922 */ $pid = pcntl_fork(); if ($pid == -1) { die('建立子進程失敗'); } else if ($pid) { //第一次退出父進程 exit(0); } //setsid posix_setsid(); echo "成功輸出,脫離終端" . PHP_EOL; sleep(5); $pid = pcntl_fork(); if ($pid == -1) { die('建立子進程失敗'); } else if ($pid) { //第二次退出父進程(以前fork出來的子進程) exit(0); } echo "依然能夠輸出" . PHP_EOL; sleep(5); //關閉各類描述符 @fclose(STDOUT); @fclose(STDERR); $STDOUT = fopen('/dev/null', "a"); $STDERR = fopen('/dev/null', "a"); chdir('/'); umask(0); echo "這裏不會輸出, ps aux | grep daemon.php 查看進程,20s後退出" . PHP_EOL; sleep(20);
php daemon.php &
這樣使用,當關閉終端後,當前php進程也會同時關掉nohup php daemon.php > daemon.log &
終端關閉後,依然會繼續運行supervisor