Como matar esses processos?

1

Problema

Eu por engano iniciei um PHP background process script que chama a si mesmo e agora criou um ciclo infinito de se chamar repetidas vezes. Atualmente envia um e-mail para minha conta do Gmail, e eu recebo toneladas de e-mails. O script PHP usa cURL para se chamar recursivamente (usando a função exec () do PHP).

Quando executo ps faux , vejo uma quantidade enorme de processos filhos do Apache e não consigo eliminá-los.

O que eu tentei

  • Eu tentei parar esses processos com kill <pid> , mas parece não ajudar - novos aparecem depois disso
  • Eu tentei matar esses processos com killall -9 httpd , que mata todos esses processos, mas também encerra o processo principal do httpd WebServer, e quando inicio esse processo novamente, todos esses processos em loop do php / apache estão de volta.
  • Removido completamente o script PHP do WebServer, isso não afeta nada
  • Reiniciou o VPS

Alguma idéia do que tentar em seguida?

UPDATE: aqui está o código:

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;

}

UPDATE: coisas adicionais que já tentei:

  • redefina as configurações do Apache e do PHP (removeu todos os Apache VHosts)

  • reiniciou o VPS várias vezes

Nada eliminou esses processos difíceis até agora

UPDATE: é assim que a tabela de processos é exibida ao executar 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

É que a segunda linha e os downards eu quero terminar de uma vez por todas.

UPDATE : Pergunta: Talvez essas tarefas httpd de re-ocorrendo sejam provenientes de algum tipo de local de cache? O que significa que essas tarefas existem / estão empilhadas em algum ambiente cache / tmp?

UPDATE : aqui está o resultado de netstat -tlpan (mascarou os IPs com 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

UPDATE: Isso poderia ser um bug no próprio Apache / httpd? Como matar o serviço Apache, uma vez deve matar todos os processos filhos para o bem.

    
por camursm 15.01.2018 / 18:13

1 resposta

0

Corrija seu código:

Olhando para o seu código (obrigado por fornecer agora) você parece estar perdendo um else - dependendo do que você deseja fazer, é claro, já que não temos especificação de requisitos.

Se você deseja apenas gerar um processo em segundo plano, tente o seguinte:

<?php

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

(...)

Caso contrário, você irá chamar todo o seu código novamente depois de enviar cada e-mail.

(Seu código original também contém poucas aspas simples ´ na instrução if , que eu presumo que esteja lá no seu arquivo, mas não na sua pergunta - a menos que o php seja ainda mais generoso com sua sintaxe do que eu pensava. )

Solução alternativa para parar os processos gerados:

Tente isso para matar

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

ou para suspender (parar) os processos:

ps aux | grep -w httpd | grep -v grep | awk '{print $2}' | xargs --no-run-if-empty kill -STOP
    
por 15.01.2018 / 21:15