Стандартный вывод влияет на SIGKILL?

У меня есть скрипт для ограничения времени выполнения команд.

лимит.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");
}

Затем я тестирую этот скрипт с некоторыми командами.

ТЕСТ А

php limit.php "php -r 'while(1){sleep(1);echo PHP_OS;}'" 3

Через 3 секунды мы можем обнаружить, что процессы были убиты, как мы и ожидали.

ТЕСТ Б

Удалите код вывода и запустите снова.

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?

Любое предложение?

0
задан Alix 10 August 2012 в 03:22
поделиться