0

既に実行中のプロセスを強制終了しようとする単純なスクリプトがあります。同じためにposix_killを使用しています。コマンド シェルから実行するとスクリプトは正常に実行されますが、ブラウザから実行すると機能しません。

<?php

    $taskid  = 33;
    killProcess($taskid);

    function killProcess($taskid) {
    $ppid = getPID($taskid);
    echo "process id -- $ppid\n";
    $pids = preg_split('/\s+/', `ps -o pid --no-heading --ppid $ppid`);
    var_dump($pids);
    foreach($pids as $pid) {
            if(is_numeric($pid)) {
            echo "Killing $pid\n";
                posix_kill($pid, 15);
            }
    }

    }
?>

私は常に次の出力を取得します。これは、スクリプトが正常に実行されていることを意味しますが、プロセスが強制終了されていないことを意味します: '4633' (長さ = 4) 2 => 文字列 '' (長さ = 0) 4633 を殺す

Apache の「error.log」ファイルを調べたところ、ブラウザから実行するたびに次のようなエントリが追加されることがわかりました。 [Sat Jun 23 12:24:55 2012] [error] [client 127.0. 0.1] ファイルが存在しません: /var/www/favicon.ico

残念ながら、このエラーからは、何が問題なのかについて多くの情報が得られません。私はphp.iniの設定をチェックアウトしましたが、何か問題があるようには見えません(私が持っている限られた理解によると)。「disabled_functions」リストなどにposix_killが表示されないか、プロセスの実行を妨げるその他の設定がありません。

助けていただければ幸いです!!

ありがとう、カピル

4

1 に答える 1

3

エラー メッセージは、問題とは関係ありません。構成していないサイトのアイコンを要求するのはブラウザだけです。

さて、実際の問題について: apache ユーザーは、プロセスを強制終了する権限を持っていない可能性があります。プロセスが別のユーザー アカウントで開始された場合、Web サーバー内からプロセスを強制終了することはできません。任意のローカル ユーザーがログインして他のユーザーのプロセスを強制終了できるマルチユーザー システムを想像してみてください。これは Unix のアクセス許可モデルではありません...

限定されたsudowithを使用するexecか、シグナルを送信する前にパーミッションを想定したい場合があります。または、プロセスに Web サーバーが何かを行うのをリッスンさせてから、プロセス自体を強制終了させることもできます。または、システム管理タイプのタスクに PHP などの Web サービス言語を使用しないでくださいcron。または、より適切なツールを使用してください。

于 2012-06-23T07:31:44.603 に答える