我有一个脚本来限制命令的执行时间长度。
限制.php
<?php
declare(ticks = 1);
if ($argc<2) die("Wrong parameter\n");
$cmd = $argv[1];
$tl = isset($argv[2]) ? intval($argv[2]) : 3;
$pid = pcntl_fork();
if (-1 == $pid) {
die('FORK_FAILED');
} elseif ($pid == 0) {
exec($cmd);
posix_kill(posix_getppid(), SIGALRM);
} else {
pcntl_signal(SIGALRM, create_function('$signo',"die('EXECUTE_ENDED');"));
sleep($tl);
posix_kill($pid, SIGKILL);
die("TIMEOUT_KILLED : $pid");
}
然后我用一些命令测试这个脚本。
测试A
php limit.php "php -r 'while(1){sleep(1);echo PHP_OS;}'" 3
3s 后,我们可以发现进程如我们预期的那样被杀死了。
测试B
删除输出代码并再次运行。
php limit.php "php -r 'while(1){sleep(1);}'" 3
结果看起来不太好,函数“exec”创建的进程没有像 TEST A 那样被杀死。
[alix@s4 tmp]$ ps aux | grep whil[e]
alix 4433 0.0 0.1 139644 6860 pts/0 S 10:32 0:00 php -r while(1){sleep(1);}
系统信息
[alix@s4 tmp]$ uname -a
Linux s4 2.6.18-308.1.1.el5 #1 SMP Wed Mar 7 04:16:51 EST 2012 x86_64 x86_64 x86_64 GNU/Linux
[alix@s4 tmp]$ php -v
PHP 5.3.9 (cli) (built: Feb 15 2012 11:54:46)
Copyright (c) 1997-2012 The PHP Group
Zend Engine v2.3.0, Copyright (c) 1998-2012 Zend Technologies
为什么进程在 TEST A 中被杀死但在 TEST B 中没有?输出会影响 SIGKILL 吗?
有什么建议吗?