开发者

Killing processes opened with popen()?

开发者 https://www.devze.com 2023-02-05 23:52 出处:网络
I\'m opening a long-running process with popen().For debugging, I\'d like to terminate the process before it has completed.Calling pclose() just blocks until the child completes.

I'm opening a long-running process with popen(). For debugging, I'd like to terminate the process before it has completed. Calling pclose() just blocks until the child completes.

How c开发者_开发百科an I kill the process? I don't see any easy way to get the pid out of the resource that popen() returns so that I can send it a signal.

I suppose I could do something kludgey and try to fudge the pid into the output using some sort of command-line hackery...


Well, landed on a solution: I switched back to proc_open() instead of popen(). Then it's as simple as:

$s = proc_get_status($p);
posix_kill($s['pid'], SIGKILL);
proc_close($p);


Just send a kill (or abort) signal using kill function:

  • php http://php.net/manual/en/function.posix-kill.php
  • c/c++ http://linux.die.net/man/3/kill


You can find the pid, and checks that you're really its parent by doing:

// Find child processes according to current pid
$res = trim(exec('ps -eo pid,ppid |grep "'.getmypid().'" |head -n2 |tail -n1'));
if (preg_match('~^(\d+)\s+(\d+)$~', $res, $pid) !== 0 && (int) $pid[2] === getmypid())
{
    // I'm the parent PID, just send a KILL
    posix_kill((int) $pid[1], 9);
}

It's working quite well on a fast-cgi PHP server.

0

精彩评论

暂无评论...
验证码 换一张
取 消