重启Apache并杀死后台进程

5
我有一个脚本startbg.php
echo `/usr/bin/php $dir/runbg.php >> $dir/logbg.txt 2>&1 &`;

我从网络上(通过HTTP / Apache)调用它。

它在后台进程中运行runbg.php

但是,如果我重启Apache(/etc/init.d/apache2 restart),后台进程就会被杀死。

有什么方法可以让进程在后台持续运行吗?


你尝试过从命令行运行它吗? - Gareth Parker
@RenePot 我需要重启Apache以使配置更改生效。 - Petah
脚本从命令行运行良好。在PHP中,使用exec也可以正常运行。问题是,如果它是从请求的页面执行的,当Apache重新启动时它会停止。 - Petah
问题在于当使用pstree命令时,后台进程没有列为apache2的子进程...我很难找到这两个进程之间关系的证据。 - Julien
3个回答

1

您可以打开一个PHP内部Web服务器的实例(自PHP 5.4.0起,CLI SAPI提供了一个内置的Web服务器)。在我的测试中,关闭httpd.exe并不会影响php.exe:8000

<?php 
//Tested with windows

chdir('../php');
//S = Server, listen interface 0.0.0.0 = all : port 8000
//t = Served document root
echo `php -S 0.0.0.0:8000 -t C:\\xampp\\htdocs >> C:\\xampp\\htdocs\\logbg.txt 2>&1 &`;
?>

所以可能(未经测试):

echo `/usr/bin/php -S 0.0.0.0:8000 -t /srv/www/yoursite.com/public_html >> /srv/www/yoursite.com/public_html/logbg.txt 2>&1 &$dir/runbg.php >> $dir/logbg.txt 2>&1 &`;

我不知道如何消除它 :s


看起来有点糊弄。我正在运行PHP 5.3,不过还是谢谢了 :) - Petah
在我看来,对于这种事情使用仅用于开发目的的php -S并不推荐。应该采取真正的Apache管理策略,以避免杀死仍在运行的进程。在我管理的生产环境中,除非所有东西都完成了,否则我不能重新启动任何东西。否则,我们会警告用户并计划进行维护。这是我的两个观点;) - user1593705
@FoxMaSk 是的,我同意。我很想知道在杀死 Apache 后是否仍然可以使用它的 OPS 问题是否可行。 - Lawrence Cherone
@LawrenceCherone,你说杀掉Apache后仍然使用它是什么意思? - Petah

0

您应该更改 startbg.phprunbg.php 的进程组 ID。

Apache/PHP 向其进程组的所有子进程发送信号。 我找不到任何关于此功能的文档。 但是,我通过从生成的进程中调用 setpgid() 解决了这个问题。


0

让进程在没有Apache的情况下继续运行的一种方法是将其作为服务。然后使用您的命令激活该服务(service runbg start)。如果您不使服务正常运行,则它将依赖于您的命令在重新启动后启动,但不会随着Apache重新启动而死亡。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接