コマンドの実行時間を制限するスクリプトがあります。
limit.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
3 秒後、プロセスが予期したとおりに強制終了されたことがわかります。
テストB
出力コードを削除して、再度実行してください。
php limit.php "php -r 'while(1){sleep(1);}'" 3
結果は良くないようです。関数「exec」によって作成されたプロセスは、テスト 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
テスト A でプロセスが強制終了されたのに、テスト B ではプロセスが強制終了されなかったのはなぜですか? 出力は SIGKILL に影響しますか?
なにか提案を?