PHP - 在不同的文件上终止 proc_open() 进程?
PHP - Kill proc_open() process on different file?
我正在使用 proc_open()
创建后台进程,我想知道如何在我的后台进程仍在 运行 时从不同的文件或操作取消或停止此后台进程?
这是我的代码:
$errorLog = './error.log';
$descriptorspec = array(
0 => array("pipe", "r"), // stdin is a pipe that the child will read from
1 => array("pipe", "w"), // stdout is a pipe that the child will write to
2 => array("file", $errorLog, "a") // stderr is a file to write to
);
proc_open("/var/bin/php /home/hello/myscript.php &", $descriptorspec, $pipes);
我已经阅读了有关 proc_terminate($process)
的内容,但似乎需要 proc_open()
返回才能停止该过程。有没有办法在同一脚本中没有 proc_open()
的情况下停止它?
执行此操作的典型方法是让 child 脚本获取其进程 ID(在 PHP 中使用 getmypid()
)并写出一个文件(通常类似于 myscript.pid
) 包含此 pid.
然后任何其他想要终止该脚本的程序都会检查 pid 文件是否存在,读取它(并可能为了稳健性,检查该 pid 的目标进程是什么),然后杀死目标过程。在 PHP 中,您可以使用 posix_kill()
来做到这一点。 (通常,您会发送 SIGTERM
或 SIGKILL
,但 SIGHUP
、SIGINT
甚至 SIGUSR1
或 SIGUSR2
都是合适的,具体取决于您希望 child 进程在收到信号时执行的操作。
或者,parent 进程可以使用 proc_get_status()
获取 child 的 pid,并将 pid 写入某处供以后使用。 (如果您需要 运行 child and/or 的多个实例,这可能更合适 child 不能以这种方式修改。)
此外,需要注意的重要一点是,在您对 proc_open
的调用中,您正试图要求 shell 在后台跨越进程。这是完全没有必要的。 proc_open
自己执行此操作,并通过强制 shell 成为中介,您实际上连接到 shell,而不是您尝试启动的进程。 (这意味着当您的脚本存在时,这也会导致 shell 杀死 child,而不是 child 在后台继续 运行。)
我正在使用 proc_open()
创建后台进程,我想知道如何在我的后台进程仍在 运行 时从不同的文件或操作取消或停止此后台进程?
这是我的代码:
$errorLog = './error.log';
$descriptorspec = array(
0 => array("pipe", "r"), // stdin is a pipe that the child will read from
1 => array("pipe", "w"), // stdout is a pipe that the child will write to
2 => array("file", $errorLog, "a") // stderr is a file to write to
);
proc_open("/var/bin/php /home/hello/myscript.php &", $descriptorspec, $pipes);
我已经阅读了有关 proc_terminate($process)
的内容,但似乎需要 proc_open()
返回才能停止该过程。有没有办法在同一脚本中没有 proc_open()
的情况下停止它?
执行此操作的典型方法是让 child 脚本获取其进程 ID(在 PHP 中使用 getmypid()
)并写出一个文件(通常类似于 myscript.pid
) 包含此 pid.
然后任何其他想要终止该脚本的程序都会检查 pid 文件是否存在,读取它(并可能为了稳健性,检查该 pid 的目标进程是什么),然后杀死目标过程。在 PHP 中,您可以使用 posix_kill()
来做到这一点。 (通常,您会发送 SIGTERM
或 SIGKILL
,但 SIGHUP
、SIGINT
甚至 SIGUSR1
或 SIGUSR2
都是合适的,具体取决于您希望 child 进程在收到信号时执行的操作。
或者,parent 进程可以使用 proc_get_status()
获取 child 的 pid,并将 pid 写入某处供以后使用。 (如果您需要 运行 child and/or 的多个实例,这可能更合适 child 不能以这种方式修改。)
此外,需要注意的重要一点是,在您对 proc_open
的调用中,您正试图要求 shell 在后台跨越进程。这是完全没有必要的。 proc_open
自己执行此操作,并通过强制 shell 成为中介,您实际上连接到 shell,而不是您尝试启动的进程。 (这意味着当您的脚本存在时,这也会导致 shell 杀死 child,而不是 child 在后台继续 运行。)