1

実行時間制限とCPU時間制限を使用してコマンドを実行するPHPスクリプトがあります。

limit.php

<?php
declare(ticks = 1);
ini_set('display_errors','on');
error_reporting(E_ALL);

if ($argc<2) die("Usage: php ".__FILE__." \"your command here\" [execute_time_limit = 600] [cpu_time_limit = 120]\n");
$cmd = $argv[1];
$tl = isset($argv[2]) ? intval($argv[2]) : 0;
$cl = isset($argv[3]) ? intval($argv[3]) : 0;
if (!$cmd) die("INCORRECT_CMD");
if ($tl<=0) $tl = 600;
if ($cl<=0) $cl = 120;

function sigalrm_handler($signo) {die('EXECUTE_ENDED');}//normal ended or killed by ulimit

$pid = pcntl_fork();
if (-1 == $pid) {
    die('FORK_FAILED');
} elseif ($pid == 0) {
    exec("ulimit -t $cl && $cmd");
    posix_kill(posix_getppid(), SIGALRM);
} else {
    pcntl_signal(SIGALRM, 'sigalrm_handler');
    sleep($tl);
    posix_kill($pid, SIGKILL);
    die("TIMEOUT_KILLED : $pid");
}

テスト用の別のPHPスクリプト。

test.php

<?php
$i=0;
echo getmypid();
while(1) {
    $i++;
    file_put_contents("/tmp/x.log",$i."\n",FILE_APPEND);
    echo "*";
    sleep(1);
}

次のコマンドを実行します。

php limit.php "php test.php" 10

「ps-ef|grep ph [p]」を使用すると、予想どおりにフォークされて強制終了されたプロセスを見つけることができます。

しかし、このコマンドを試すと、

php limit.php "php test.php> /tmp/y.log" 10

予想どおり、子プロセスを強制終了することはできません。見る:

始まり:

===============

alix     28979 23528  0 17:32 pts/0    00:00:00 php limit.php php test.php > /tmp/y.log 10
alix     28980 28979  0 17:32 pts/0    00:00:00 php limit.php php test.php > /tmp/y.log 10
alix     28981 28980  0 17:32 pts/0    00:00:00 sh -c ulimit -t 120 && php test.php > /tmp/y.log
alix     28982 28981  0 17:32 pts/0    00:00:00 php test.php

10秒後:

=================

alix     28981     1  0 17:32 pts/0    00:00:00 sh -c ulimit -t 120 && php test.php > /tmp/y.log
alix     28982 28981  0 17:32 pts/0    00:00:00 php test.php

PID 28979は28980をフォークし、関数execはPID 28981と28982で2つの子プロセスを作成しました。10秒後、28979はSIGKILLを28980に送信しますが、28981と28982は影響を受けませんでした(">/tmpのような出力リダイレクトがない場合は強制終了されます/y.log ")。

私のサーバーは: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 with PHP 5.3.9(cli)(ビルド:2012年2月15日11: 54:46)

なにか提案を?

4

1 に答える 1

0

理由はPIPEです。私の別の質問の答えを確認してください:

標準出力への影響SIGKILL?

于 2013-05-03T03:23:18.907 に答える