gpt4 book ai didi

php - 如何在杀死 php 脚本后杀死 passthru 进程?

转载 作者:太空狗 更新时间:2023-10-29 12:04:56 26 4
gpt4 key购买 nike

我正在通过 PHP passthru() 运行 linux 命令,示例:

<?php
file_put_contents("script.pid", getmypid());
passthru("sleep 500", $exit);

现在说我要终止脚本。我会终止 script.pid 中列出的进程;但是,这会使 sleep 500(或任何进程)在后台运行。尽管我将 passthru() 用于 exit 返回变量,但我从 system() 和 shell_exec() 得到了相同的结果。任何人都知道解决方案,甚至是为什么这会使进程在后台运行的原因?

最佳答案

函数 passthru() 生成一个 shell 来运行您的命令,然后阻塞直到 passthru 进程返回。这些是独立的进程,与运行脚本的 php 解释器具有不同的进程 ID。您可以终止脚本,但不会终止它启动的进程。

然而,生成的进程具有相同的进程组 ID (PGID),您可以使用它来杀死它们或向它们发送任何其他信号。在我们的例子中,PGID 与 php 脚本的进程 ID (PID) 相同。

要查看 PGID,您可以执行命令:ps axjf,您将得到如下内容:

PPID   PID  PGID   SID TTY      TPGID STAT   UID   TIME COMMAND
24077 12484 12484 24077 pts/9 12484 S+ 1000 0:00 | \_ php sleepScript.php
12484 12486 12484 24077 pts/9 12484 S+ 1000 0:00 | \_ sh -c sleep 500
12486 12487 12484 24077 pts/9 12484 S+ 1000 0:00 | \_ sleep 500

我们示例中的 PGID 是 12484(与 php 脚本的 PID 相同),要向该组发送终止信号,请使用 PGID 前面带负号的 kill 命令,即:

kill -15 -24077

您将终止所有三个进程。

关于php - 如何在杀死 php 脚本后杀死 passthru 进程?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/17840503/

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