アップデート:これはApache / httpd自体のバグかもしれませんか? Apacheサービスを一度終了すると、すべての子プロセスが永久に終了する必要があるためです。

アップデート:これはApache / httpd自体のバグかもしれませんか? Apacheサービスを一度終了すると、すべての子プロセスが永久に終了する必要があるためです。

質問

誤って自分自身を呼び出す関数を起動し、PHP background process script今度は自分自身を呼び出し続ける無限ループを作成しました。現在私のGmailアカウントにメールを送信しており、多数のメールを受け取ります。 PHPスクリプトはcURLを使用して自分自身を再帰的に呼び出します(PHP exec()関数を使用)。

実行するとps faux多数のApacheサブプロセスが表示されますが、それを終了することはできません。

私が試したこと

  • このプロセスを停止しようとしましたが、kill <pid>役に立たなかったようです。その後、新しいプロセスが表示されます。
  • 私は以下を使用してこれらのkillall -9 httpdプロセスを終了しようとしました。
  • WebサーバーからPHPスクリプト自体を完全に削除しましたが、これはまったく影響しません。
  • VPSの再起動

次は何を試すかというアイデアはありますか?


更新:コードは次のとおりです。

example.com -> /var/www/site1/index.php:

<?php

require_once "processor.php";

<html>
...

/var/www/site1/processor.php:

<?php

if (isset($_POST['test]) && $_POST['test] == 1) {
  // send an e-mail to my Gmail account
}

run_background_process('example.com', 'test=1');
    
function run_background_process($url, $params) {

  // do a normal cURL POST
  $cmd = 'curl -X POST ';
  // append the URL to the script
  $cmd .= $url;
  // add any variables that needs to be passed to the target script
  $cmd .= ' -d "' . $params . '"';
  // run it in the background so it does not affect page load
  $cmd .= " > /dev/null 2>&1 &"; 
  // execute
  exec($cmd, $output, $exit); 
  return $exit == 0;

}

アップデート:今試したこと以外:

  • ApacheおよびPHP設定のリセット(すべてのApache VHostを削除)

  • VPSを数回再起動

これまで、このような頑固なプロセスを殺す方法はありませんでした。


更新:以下は、実行時のプロセステーブルの外観ですps faux

root      1305  1.0  1.1  39444 12096 ?        Ss   13:38   0:00 /usr/sbin/httpd
apache    1307  0.0  0.5  39444  6192 ?        S    13:38   0:00  \_ /usr/sbin/httpd
apache    ...   ...  ...  .....  .... .        .    .....   ....  \_ /usr/sbin/httpd

この仕事を一度に終わりたいです。これは2行目以下です。


修正する:質問:これらの繰り返しのhttpd操作は、ある種のキャッシュ位置からのものかもしれませんか?これは、一部のキャッシュ/一時環境に存在するか積み重ねることを意味しますか?


修正する:結果です。netstat -tlpan(IPをブロックするにはxを使用してください)

Proto Recv-Q Send-Q Local Address               Foreign Address             State       PID/Program name
tcp        0      0 127.0.0.1:25                0.0.0.0:*                   LISTEN      900/sendmail
tcp        0      0 x.x.x.x:8000                0.0.0.0:*                   LISTEN      22457/httpd
tcp        0      0 0.0.0.0:7648                0.0.0.0:*                   LISTEN      554/sshd
tcp        0      0 0.0.0.0:1345                0.0.0.0:*                   LISTEN      949/perl
tcp        0      0 0.0.0.0:3306                0.0.0.0:*                   LISTEN      836/mysqld
tcp        0      0 0.0.0.0:80                  0.0.0.0:*                   LISTEN      22457/httpd
tcp        0     64 x.x.x.x:7648                x.x.x.x:56524       ESTABLISHED 27410/sshd
tcp        0      0 :::7648                     :::*                        LISTEN      554/sshd

アップデート:これはApache / httpd自体のバグかもしれませんか? Apacheサービスを一度終了すると、すべての子プロセスが永久に終了する必要があるためです。

答え1

コードを編集してください。

あなたのコードを見てみると(今すぐ利用できるようにしていただきありがとうございます)、1つが欠けているようです。elseもちろん、要件仕様がないため、実行したい操作によって異なります。

1つのバックグラウンドプロセスのみを作成するには、次のことを試してください。

<?php

if (isset($_POST['test']) && $_POST['test'] == 1) {
  // send an e-mail to my Gmail account
}
else
  run_background_process('example.com', 'test=1');

(...)

それ以外の場合は、各電子メールが送信された後にすべてのコードが再度呼び出されます。

´(あなたの元のコードには、宣言にあまりにも少ない一重引用符が含まれています。ifこれは、PHPの構文が私が思ったよりも寛大でない限り、あなたのファイルに存在し、問題の一部ではないと仮定します。)

生成されたプロセスを停止する回避策:

これで殺してください。

ps aux | grep -w httpd | grep -v grep | awk '{print $2}' | xargs --no-run-if-empty kill -KILL

または、プロセスを一時停止(停止)します。

ps aux | grep -w httpd | grep -v grep | awk '{print $2}' | xargs --no-run-if-empty kill -STOP

関連情報