質問
誤って自分自身を呼び出す関数を起動し、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