linux - 如何重启后台php进程? (如何获取pid)

标签 linux shell unix pid kill-process

我是一名 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/

相关文章:

unix - 将 cat 的输出通过管道传递给 cURL 以下载文件列表

c - h_errno 总是打印 "unknown host"

c++ - 将文件拆分为相等的字节部分,由完整的字分隔 (C/C++)

c++ - 用户空间缓冲区和内存映射文件之间的 DMA

linux - 如何将非 UTF-8 格式的 xml 文件转换为符合 UTF-8 格式的 xml

linux - 如何更改所有用户和所有 shell 的路径?

linux - 尝试理解简单的 Linux 代码

linux - 当设备是调制解调器时,USB 类有什么不同?

linux - 什么是最快的 egrep

通过 ssh 在远程服务器上运行多个不相关命令的 Java 库