nohup php script.php > log.txt 2>&1 & 能防终端中断,因其让进程忽略SIGHUP信号并后台运行;但非真正守护进程,需确保脚本含循环逻辑、禁用超时、重定向路径可写且有错误捕获。

直接用 nohup 启动 PHP 脚本,**不是真正的守护进程,但能解决“终端关闭就中断”这个最常见痛点**。它不涉及进程会话脱离、PID 管理或自动重启,但胜在简单、无依赖、几乎 100% 有效——只要脚本本身没崩溃,就能一直跑。
nohup php script.php > log.txt 2>&1 & 为什么能防中断
本质是绕过 SIGHUP 信号:当 SSH 断开或终端关闭时,系统默认向该会话中所有前台/后台 job 发送 SIGHUP,而 nohup 会让进程忽略该信号。加上 & 把它丢进后台,就不再受当前 shell 生命周期约束。
-
2>&1必须写在重定向之后(即先有> log.txt),否则错误输出仍会打到终端 - 日志文件路径要确保目录可写,比如
/var/log/myapp/需提前mkdir -p /var/log/myapp && chown www-data:www-data /var/log/myapp - 如果脚本里用了
sleep()或usleep(),注意别设成sleep(0)—— 某些 PHP 版本下会退化为忙循环,CPU 占满 - 不要省略
2>&1:PHP 的警告、Notice、Fatal 错误都走 stderr,不重定向就看不到关键报错
nohup 启动后怎么查进程和停掉它
它只是把进程扔进后台,没生成 PID 文件,所以不能靠 cat /var/run/xxx.pid 来 kill。得靠 ps + grep 定位:
- 查进程:
ps aux | grep 'php.*script\.php'—— 加单引号和\.是为了精确匹配文件名,避免误杀其他含script的进程 - 停进程:
kill $(pgrep -f 'php.*script\.php'),比killall php安全得多 - 如果脚本卡死、
kill不响应,再加-9:kill -9 $(pgrep -f 'php.*script\.php') - 想留 PID 文件?自己在脚本开头加一句:
file_put_contents('/var/run/mydaemon.pid', getmypid());,记得unlink()清理
nohup 和 & 组合的三个典型翻车点
看着命令没错,但脚本就是不持久、日志为空、或者一断网就挂——大概率栽在这三处:
-
php script.php脚本里没写循环逻辑:nohup 只保进程不死,不保业务逻辑持续。必须有while (true) { ... sleep(5); }或事件监听,否则脚本执行完就退出 - 脚本用了
ignore_user_abort(true)但没配set_time_limit(0):CLI 模式下超时默认是 30 秒,超时后进程被 PHP 自己 kill,nohup也救不了 - 输出重定向路径权限不对,或磁盘满了:此时
nohup会静默失败,进程看似在跑,但fwrite()、error_log()全部丢弃,查不到任何线索
真正需要进程自动拉起、资源隔离、信号控制或多实例管理时,nohup 就力不从心了——这时候该切到 Supervisor 或 systemd,而不是给 nohup 套壳加 pidfile、信号转发、内存监控……那已经是在重复造轮子了。
php免费学习视频:立即使用
踏上前端学习之旅,开启通往精通之路!从前端基础到项目实战,循序渐进,一步一个脚印,迈向巅峰!











