CentOS 6.3环境下PHP 5.3无法通过&后台运行脚本求助
CentOS 6.3 + PHP 5.3 下单独用
& 后台运行PHP脚本失败的问题排查与解决 我之前维护老版本CentOS服务器时也踩过一模一样的坑,咱们先把问题的核心逻辑理清楚:你直接运行PHP脚本、用nohup后台跑都正常,但单独加&就失效,本质是终端会话的信号机制和进程IO依赖在搞鬼。
为什么单独用&会失败?
当你执行/usr/bin/php test.php &时,这个PHP进程只是被放到当前终端会话的后台,它依然是该会话的子进程:
- 一旦你关闭终端、或者SSH会话断开,系统会给所有属于该会话的子进程发送
SIGHUP(挂起)信号,默认情况下进程收到这个信号就会直接终止; - 还有一种可能:哪怕是最简单的
echo 'Hello World!'脚本,PHP进程也可能隐式依赖终端的标准输入,放到后台后输入通道断开,导致进程因IO异常退出。
而nohup之所以能正常运行,是因为它帮你做了两件关键的事:
- 自动忽略
SIGHUP信号,避免会话结束时进程被终止; - 默认把标准输入重定向到
/dev/null,同时把标准输出、错误输出写到nohup.out(你也可以自定义输出文件),彻底切断了进程和终端的IO关联。
几个可行的解决方案
方案1:手动重定向IO并后台运行
直接修改命令,模拟nohup的核心逻辑,彻底切断进程和终端的关联:
/usr/bin/php test.php > res 2>&1 < /dev/null &
> res:把标准输出写入res文件;2>&1:把错误输出重定向到和标准输出同一个文件;< /dev/null:让进程不从终端读取任何输入,消除IO依赖。
方案2:用disown剥离会话关联
如果已经执行了/usr/bin/php test.php &,可以立即用disown命令把进程从当前会话的作业列表中移除,这样会话结束时就不会给它发SIGHUP信号:
# 先查看后台作业的编号,%1代表第一个后台作业 jobs # 剥离进程和当前会话的关联 disown -h %1
方案3:用screen管理后台会话(适合长期运行的进程)
如果需要长期维护这个PHP进程,或者之后还要查看进程的输出/交互,推荐用screen(CentOS 6.3可以直接通过yum安装):
- 安装screen:
yum install screen -y
- 启动一个命名的screen会话:
screen -S php_test_session
- 在会话里直接运行你的PHP脚本:
/usr/bin/php test.php
- 按
Ctrl+A然后按D,就能脱离这个会话,进程会在后台持续运行; - 之后想要重新查看会话内容,执行:
screen -r php_test_session
内容的提问来源于stack exchange,提问作者Randall Cheng
相关产品推荐
相关产品推荐

