我是一名 PHP 开发人员,对 shell 脚本知之甚少...因此,我非常感谢您的帮助。
我有四个需要在服务器后台运行的 php 脚本。我可以很好地启动它们 - 它们工作得很好 - 我可以通过查找它们的 PID 来杀死它们。
问题是我需要我的脚本不时地终止进程并重新启动它们,因为它们维护着长期存在的 HTTP 请求,有时会被另一端终止。
但我不知道如何编写一个命令来找到这些进程并在不手动查找 PID 的情况下杀死它们。
我们将从一个启动命令开始:
/usr/local/php5/bin/php -f /home/path/to/php_script.php > /dev/null &
有没有办法“分配”一个 PID 使其始终相同?或者给进程起个名字?我将如何着手编写新命令?
谢谢!
最佳答案
不,您不能“分配”进程 PID;相反,你应该像“真正的”守护进程那样做:让你的脚本在某个文件中保存它自己的 PID,然后在你需要终止时从该文件中读取它。
替代方法是使用类似 supervisor 的东西,它会以非常好的方式为您处理所有这些事情。
更新 - 主管配置
因为我提到了 supervisor,所以我也在这里发布了一个应该完成这项工作的简短 supervisor 配置文件。
[program:yourscriptname]
command=/usr/local/php5/bin/php -f /home/path/to/php_script.php
Have a look here for more configuration options .
然后你可以像这样使用它:
# supervisorctl status
显示进程状态。
# supervisorctl start yourscriptname
开始你的脚本
# supervisorctl stop yourscriptname
停止你的脚本
更新 - 真实世界的主管配置示例
首先,确保你的 /etc/supervisor/supervisord.conf
中有这个。
[include]
files = /etc/supervisor/conf.d/*.conf
如果没有,只需添加这两行
mkdir /etc/supervisor/conf.d/
然后,为您要启动的每个进程创建一个配置文件:
/etc/supervisor/conf.d/script1.conf
[program:script1]
command=/usr/local/php5/bin/php -f /home/path/to/php_script.php
stdout_logfile=/var/log/script1.log
stderr_logfile=/var/log/script1-error.log
/etc/supervisor/conf.d/script2.conf
[program:script2]
command=/usr/local/php5/bin/php -f /home/path/to/php_script2.php
stdout_logfile=/var/log/script2.log
stderr_logfile=/var/log/script2-error.log
...等等,等等...用于您所有的脚本。
(请注意,您不需要尾部的 &,因为主管会为您处理所有守护进程;事实上,您不应该执行自己的程序-在主管内部进行守护进程)。
然后你可以开始他们:
supervisorctl start all
或者只是一个像这样的东西:
supervisorctl start script1
从 php 启动 supervisor
当然,您甚至可以从脚本内部使用上述两个命令启动/停止主管控制的进程。
但是请记住,您需要 root 权限,并且允许 eg.在服务器上以 root 身份执行命令的网页..
如果是这种情况,我建议您查看有关如何 run supervisor as a normal user 的说明。 (我从来没有这样做过,但你也应该能够以 www-data 用户的身份运行它......)。
关于linux - 如何重启后台php进程? (如何获取pid),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/12944212/