如何在服务器运行多个并行持久PHP脚本,终端断开后仍持续无重叠运行
解决方案
临时快速运行方案
适合临时调试、不需要开机自启的场景,一行命令即可实现并行静默后台运行,终端关闭后进程不受影响:
nohup php myscript1.php > /dev/null 2>&1 & nohup php myscript2.php > /dev/null 2>&1 & nohup php myscript3.php > /dev/null 2>&1 &
命令说明
nohup:忽略终端挂断信号,保证终端退出后进程持续运行> /dev/null 2>&1:将标准输出、错误输出全部重定向到空设备,实现完全静默- 末尾
&:将进程放入后台执行,无需等待当前进程结束即可执行下一条命令,天然实现并行 - 查看运行进程:执行
ps aux | grep php即可看到所有后台运行的PHP进程,记下对应PID可通过kill PID终止对应任务
长期稳定托管方案
适合需要长期运行、要求开机自启、方便统一管理的场景,用系统自带的Systemd服务托管,无需额外安装工具,还支持进程意外退出自动重启:
- 为每个脚本单独创建服务配置文件,路径为
/etc/systemd/system/myscript1.service,模板内容如下:
[Unit] Description=循环任务脚本1 After=network.target [Service] Type=simple User=替换为实际运行脚本的用户名(避免用root) ExecStart=替换为php的绝对路径 替换为脚本的绝对路径(例如/usr/bin/php /opt/scripts/myscript1.php) Restart=always RestartSec=3 StandardOutput=null StandardError=null [Install] WantedBy=multi-user.target
- 所有脚本的配置文件创建完成后,执行命令重载配置:
systemctl daemon-reload
- 常用管理命令:
- 启动单个任务:
systemctl start myscript1 - 停止单个任务:
systemctl stop myscript1 - 重启单个任务(改完参数后用):
systemctl restart myscript1 - 设置开机自启:
systemctl enable myscript1 - 批量操作所有同类任务:
systemctl start myscript*.service - 查看任务运行状态:
systemctl status myscript1
两种方案都完全适配你的需求:脚本本身内置循环+执行完成后休眠的逻辑,全程仅运行单个实例,不会出现任务重叠的问题,同时满足并行、静默、终端关闭不终止的要求。
内容的提问来源于stack exchange,提问作者Gideon
相关产品推荐
相关产品推荐

