我正在使用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()
的情况下阻止它?
答案 0 :(得分:1)
执行此操作的典型方法是让子脚本获取其进程ID(在PHP中使用getmypid()
)并写出包含此pid的文件(通常类似于myscript.pid
)。 / p>
然后,任何想要终止该脚本的任何其他内容都会检查pid文件是否存在,读取它(并且可能是为了健壮性,检查该pid中的目标进程是什么),然后杀死目标进程。在PHP中,您可以使用posix_kill()
执行此操作。 (通常情况下,您会发送SIGTERM
或SIGKILL
,但SIGHUP
,SIGINT
,甚至SIGUSR1
或SIGUSR2
都是合适的,具体取决于发信号时你希望子进程做什么。
或者,父进程可以使用proc_get_status()
获取子进程的pid,并将pid写在某处以供以后使用。 (如果您需要运行子项的多个实例和/或无法以这种方式修改子项,这可能更合适。)
另外,需要注意的是,在调用proc_open
时,您试图让shell在后台跨越该过程。这完全没必要。 proc_open
自己做,并且通过强制shell成为中介,你实际上是连接到shell,而不是你试图启动的进程。 (这意味着当你的脚本存在时,这也会导致shell杀死孩子,而不是孩子继续在后台运行。)