守护进程(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