15

このプロセスを開始しました(time.php)

<?php

ignore_user_abort(true); // run script in background
set_time_limit(0);       // run script forever 
$interval = 300;         // do every 1 minute...
do
{ 
    // add the script that has to be ran every 1 minute here
    // ...

    $to      = "xxxxxxxxx@gmail.com";
    $subject = "Hello Richie";
    $header  = "From: me@xxxxxxxxx.org";
    $body    = "Hello Richard,\n\n"
             . "I was just testing this service\n\n "
             . "Thanks! ";

    mail($to, $subject, $body, $header);

    sleep($interval); // wait 5 minutes

} while(true); 
?>

しかし、私は今それを止めたいと思います。それは私のGmaila/cに何百ものメールを送っています。プロセスを強制終了するために再起動できないWebサーバー上にあります。

プロセスを強制終了するために別のファイルを実行する方法はありますか、またはどうすればよいですか?

4

6 に答える 6

22

シェルにアクセスできない場合、唯一の方法は、サーバー管理者にプロセスを強制終了するよう依頼することです。

そうは言っても、次のように、スクリプトをセットアップして、同じサーバー上の他のスクリプトからキャンセルできるようにする簡単な方法があります。

<?php
// at start of script, create a cancelation file

file_put_contents(sys_get_temp_dir().'/myscriptcancelfile','run');

// inside the script loop, for each iteration, check the file

if ( file_get_contents(sys_get_temp_dir().'/myscriptcancelfile') != 'run' ) { 
    exit('Script was canceled') ; 
}

// optional cleanup/remove file after the completion of the loop

unlink(sys_get_temp_dir().'/myscriptcancelfile');

// To cancel/exit the loop from any other script on the same server

file_put_contents(sys_get_temp_dir().'/myscriptcancelfile','stop');

?>
于 2014-12-04T14:43:11.537 に答える
8

シェルへのアクセスもないと仮定しています。最も簡単な方法は、管理者に連絡して Apache を再起動してもらうことだと思います。彼らはあなたよりもこれ以上これが実行されることを望んでいません。

1 つの代替方法は、PHP を使用してすべての Apache プロセスを強制終了しようとすることです。実行中の Apache プロセスを除くすべての Apache プロセスに kill シグナルを送信します。これは、Apache プロセスが setuid() なしで共有プロセスの下で実行されている場合に機能する可能性があります。あなた自身の責任で試みてください。

<?php
$cpid = posix_getpid();
exec("ps aux | grep -v grep | grep apache", $psOutput);
if (count($psOutput) > 0)
{
    foreach ($psOutput as $ps)
    {
        $ps = preg_split('/ +/', $ps);
        $pid = $ps[1];

        if($pid != $cpid)
        {
          $result = posix_kill($pid, 9); 
        }
    }
}
?>
于 2012-12-12T19:59:32.020 に答える
4

バックグラウンドで起動した場合は、ps aux | grep time.phpPID を取得するために使用します。それからちょうどkill PID。プロセスがフォアグラウンドで開始された場合、それを中断するために使用します。

プロセスが Apache 内で開始された場合は、Apache を再起動します (Debian の場合は /etc/init.d/apache2 restart)。プロセスが CGI ライクなサーバーで開始された場合は、サーバーを再起動します。

于 2012-12-12T19:52:47.983 に答える
3

php スクリプトの実行を停止するには、ターミナルで次のコマンドを入力するだけです。これにより、Apache サービスが再起動されます。(最終的にphpサービスを再起動します)。

sudo service apache2 restart

将来、スクリプト内にタイムアウトを含めたいと思うかもしれません。

于 2015-02-19T16:36:33.977 に答える
0

実行中のApacheプロセスを強制終了できます。apachectl stopのようなものを実行apachectl startしてから、バックアップを開始してみてください。これにより、一定期間サーバーが強制終了されますが、そのスクリプトでスタックしているプロセスが確実になくなります。

于 2012-12-12T19:52:20.323 に答える