У меня есть сценарий для ограничения времени выполнения команд.
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
Через 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?
Любое предложение?