【问题标题】:how to kill a passthru process upon the kill of a php script?如何在杀死 php 脚本后杀死 passthru 进程?
【发布时间】:2013-07-24 07:29:33
【问题描述】:

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

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

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

【问题讨论】:

    标签: php linux kill passthru


    【解决方案1】:

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

    但是,生成的进程具有相同的进程组 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
    

    您将终止所有三个进程。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2016-01-24
      • 2012-09-30
      • 2012-11-22
      • 1970-01-01
      • 2012-06-13
      • 2016-07-08
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多