【发布时间】:2018-08-06 11:17:45
【问题描述】:
我正在尝试启动一个 php(在 apache 下)进程(通过从浏览器调用 apache),这将在关闭 apache 服务器后继续存在(sudo service apache2 stop)。即使我确保创建的进程没有父进程(父进程 1),并且有它自己的会话,但不知何故,当我停止 apache(或重新启动 apache)时,进程还是死了
我创建了一个 test.php 文件:
<?php
exec('setsid nohup sleep 1000 > /dev/null 2>/dev/null &');
?>
当运行对该 test.php 执行 HTTP GET 时,确实我们会立即得到 OK 响应,并且该过程仍然存在。 但是,当我们这样做时:
sudo service apache2 stop
睡眠进程终止。 当进程不属于其组或会话并且进程不是子进程时,如何杀死进程?
【问题讨论】:
-
“我正在尝试从 php (+apache) 启动一个进程” - 你是通过浏览器调用脚本,还是通过 Apache?
-
没错。简单的 apache 服务器,它调用我在问题中编写的 php 脚本。
-
cron 是一个选项吗?如果例如,您可以每分钟检查一次。数据库表中有条目然后被处理。如果是关于文件,想象一下使用this answer
-
为什么是 cron?为什么选择数据库?我只想要一个可以保持活力的简单过程(孤儿?)。就这么简单。我不明白 apache 如何拥有终止进程的权利/特权。也许apache保存了一个由php生成的进程的PID列表,并在关闭期间一一杀死它们?
-
尝试创建一个进程,分叉它并杀死父进程。那时不应该与 Apache 有任何联系。我记得我在类似的情况下使用过这种方法(不记得具体是什么)。基本上你可以通过跟踪它们的
ppid来判断哪些进程是由 Apache 产生的,但是如果父进程不再存在,你就会中断链。