更新:这可能是 Apache / httpd 本身的错误吗?因为终止 Apache 服务一次就应该永久终止所有子进程。

更新:这可能是 Apache / httpd 本身的错误吗?因为终止 Apache 服务一次就应该永久终止所有子进程。

问题

我错误地启动了一个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

相关内容