gpt4 book ai didi

php - 在 Apache/PHP 中如何运行一个独立的进程并在 Linux 上重启 Apache

转载 作者:太空宇宙 更新时间:2023-11-04 12:03:00 25 4
gpt4 key购买 nike

我正在尝试启动一个 php(在 apache 下)进程(通过从浏览器调用 apache),它将在关闭 apache 服务器(sudo service apache2 stop)后继续存在。即使我确定创建的进程没有父进程(父进程 1),并且有自己的 session ,但当我停止 apache(或重新启动 apache)时,进程仍然以某种方式终止

我创建了一个 test.php 文件:

<?php
exec('setsid nohup sleep 1000 > /dev/null 2>/dev/null &');
?>

当运行对这个 test.php 执行 HTTP GET 时,我们确实立即得到了 OK 响应,并且进程仍然存在。但是,当我们这样做时:

sudo service apache2 stop

sleep 进程结束。当进程不属于其组或 session 并且进程不是子进程时,有人如何终止该进程?

最佳答案

Apache 可能会有一个生成的进程列表,并单独杀死它们,而不是作为一个组。在这种情况下,列表中的所有进程都将被kill(2)。但请参阅下面的下一段以了解可能性。

查看kill(2) 系统调用的手册页。在错误部分,失败的唯一可能性是:

  • EINVAL,表示传递了无效的信号编号。不适用于此处。

  • ESRCH,进程(或进程组)不存在。也不适用。

  • EPERM,您没有发送信号的权限。这适用于此,但唯一允许您向其发送信号的进程(这与进程层次结构或父关系无关)是使用真实/保存的用户 ID 运行的进程等于发送方进程的有效用户 ID。因此,由于 Apache 拥有它启动的所有进程的注册表,因此它能够终止进程是正常的。

无论如何,您是否尝试过创建一个进程,从该进程创建一个子进程,并在孙子进程中执行 setsid?这样,Apache 进程就没有机会将其注册到派生进程列表中。我没有尝试过,但它可以工作。

来自 FreeBSD kill(2) 手册页:

For a process to have permission to send a signal to a process designated by pid, the user must be the super-user, or the real or saved user ID of the receiving process must match the real or effective user ID of the sending process. A single exception is the signal SIGCONT, which may always be sent to any process with the same session ID as the sender.

(强调是我的)在 linux 中,它几乎是一样的,除了

... (if the sending process) have the CAP_KILL capability in the user namespace of the target process...

但这在这里不适用。

关于php - 在 Apache/PHP 中如何运行一个独立的进程并在 Linux 上重启 Apache,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/51706397/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com