我是一名PHP开发人员,对shell脚本知之甚少......所以我很感激这里有任何帮助。
我需要在我的服务器后台运行四个php脚本。我可以很好地启动它们 - 它们工作得很好 - 我可以通过查找它们来杀死它们。
问题是我需要我的脚本,不时地杀死进程并重新启动它们,因为它们维护了有时由另一方结束的长期HTTP请求。
但是我不知道如何编写一个命令来找到这些进程并杀死它们而不需要手动查找PID。
我们将从一个启动命令开始:
/usr/local/php5/bin/php -f /home/path/to/php_script.php > /dev/null &
有没有办法“分配”一个PID,所以它总是一样的?或者给这个过程命名?我将如何编写新命令?
谢谢!
答案 0 :(得分:4)
不,你不能“分配”过程PID;相反,你应该像“真正的”守护进行一样:让你的脚本在某个文件中保存自己的PID,然后在需要杀死时从该文件中读取它。
替代方案是使用类似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/
然后,为要启动的每个进程创建一个configurtion文件:
/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
...等等..用于所有脚本。
(请注意,不需要尾随& as supervisor将为您处理所有守护程序的事情;实际上您不应该执行的程序是内部主管自我守护)。
然后你可以开始使用:
supervisorctl start all
或只是一个像:
supervisorctl start script1
当然,您可以使用上面的两个命令启动/停止主管控制的进程,即使是在脚本内部也是如此。
但请记住,您需要root权限,并且允许例如,这是非常危险的。在服务器上以root身份执行命令的网页..
如果是这种情况,我建议您查看有关如何run supervisor as a normal user的说明(我从未这样做,但您应该能够以www-data用户身份运行它......)。
答案 1 :(得分:3)
解决此问题的规范方法是让进程将其PID写入已知位置的文件中,然后任何实用程序脚本都可以查找文件,读取PID并操纵该进程。向脚本添加命令行参数,该参数提供要写入的PID文件的名称。
答案 2 :(得分:0)
解决这个问题的方法是使用ps aux
,这将使用调用它们的命令显示所有进程。当然,这假设4个脚本是不同的文件,或者可以通过调用它们的命令唯一地标识。通过grep管道,你已经设置ps aux | grep runningscript.php
答案 3 :(得分:0)
OK!所以对于那些不知道有关shell / bash无论是什么脚本的人来说,这一直是一个令人头痛的问题......
@redShadow的回复本来是完美的,除了我的托管服务提供商不会让我访问/ etc / supervisor /目录。正如他所说的,你必须是root用户 - 即使使用sudo
,管理员也不会让我在那里有机会...
以下是我提出的建议:
kill -9 `ps -ef | grep php | grep -v grep | awk '{print $2}'`
因为我执行的唯一命令类型在top
命令中显示为php
,此命令循环运行进程,找到php
命令及其相应的PID并杀死它们!活泉!!
答案 4 :(得分:0)
我所做的是让我的脚本检查一个名为“run.txt”的文件。如果没有 存在,他们退出。然后只需重命名该(空)文件,我就可以停止所有脚本了。