问题
我错误地启动了一个PHP background process script
调用自身的函数,现在已经创建了一个一遍又一遍地调用自身的无限循环。目前它会向我的 Gmail 帐户发送一封电子邮件,我会收到大量电子邮件。 PHP 脚本使用 cURL 递归地调用自身(使用 PHP exec() 函数)。
当我运行时,ps faux
我看到大量的 Apache 子进程,但我似乎无法杀死它们。
我尝试过的
- 我尝试停止这些进程,
kill <pid>
但似乎没有帮助 - 此后会弹出新的进程 - 我尝试使用 来终止这些进程
killall -9 httpd
,这会终止所有这些进程,但它也会终止主 httpd WebServer 进程本身,当我再次启动该进程时,所有这些循环 php/apache 进程都会回来。 - 从 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
我想一劳永逸地终止这就是第二行和下行。
更新:问题:也许这些重复发生的 httpd 任务来自某种缓存位置?意味着这些任务存在/堆积在某些缓存/临时环境中?
更新:这是结果netstat -tlpan
(用 x 屏蔽 IP)
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
更正您的代码:
查看您的代码(感谢您现在提供它),您似乎缺少一个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