업데이트: 이것이 Apache/httpd 자체의 버그일 수 있습니까? Apache 서비스를 한 번 종료하면 모든 하위 프로세스가 영구적으로 종료되어야 하기 때문입니다.

업데이트: 이것이 Apache/httpd 자체의 버그일 수 있습니까? Apache 서비스를 한 번 종료하면 모든 하위 프로세스가 영구적으로 종료되어야 하기 때문입니다.

질문

실수로 자기 자신을 호출하는 함수를 시작했고 PHP background process script이제 자기 자신을 계속해서 호출하는 무한 루프를 만들었습니다. 현재 내 Gmail 계정으로 이메일을 보내고 있으며 수많은 이메일을 받습니다. PHP 스크립트는 cURL을 사용하여 자신을 재귀적으로 호출합니다(PHP exec() 함수 사용).

실행하면 ps faux수많은 Apache 하위 프로세스가 표시되지만 이를 종료할 수는 없습니다.

내가 시도한 것

  • 이 프로세스를 중지하려고 시도했지만 kill <pid>도움이 되지 않은 것 같습니다. 이후에 새 프로세스가 나타납니다.
  • 나는 다음을 사용하여 이러한 killall -9 httpd프로세스를 종료하려고 시도했습니다.
  • 웹 서버에서 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

코드를 수정하세요.

귀하의 코드를 살펴보면(지금 사용할 수 있게 해주셔서 감사합니다) 하나가 누락된 것 같습니다. 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

관련 정보