2012-12-12 16 views
13

ho iniziato questo processo (time.php)Come faccio a interrompere uno script PHP in esecuzione sullo sfondo

<?php 

ignore_user_abort(true); // run script in background 
set_time_limit(0);  // run script forever 
$interval = 300;   // do every 1 minute... 
do 
{ 
    // add the script that has to be ran every 1 minute here 
    // ... 

    $to  = "[email protected]"; 
    $subject = "Hello Richie"; 
    $header = "From: [email protected]"; 
    $body = "Hello Richard,\n\n" 
      . "I was just testing this service\n\n " 
      . "Thanks! "; 

    mail($to, $subject, $body, $header); 

    sleep($interval); // wait 5 minutes 

} while(true); 
?> 

ma ora voglio fermarlo. Invia centinaia di mail al mio account Gmail a/c. È su un server web dove non posso riavviarlo per uccidere il processo.

Esiste un modo per eseguire un altro file per terminare il processo o come procedere?

+9

dal comando riga 'kill '. E la prossima volta non iniziare quello che non sai come fermare –

+0

Il tuo host ti dà accesso alla console (SSH)? –

+5

'ignore_user_abort (true);' + 'while (true);' + 'mail' =' Very Bad' – Baba

risposta

0

È possibile interrompere il processo di apache in esecuzione. Prova a eseguire qualcosa come apachectl stop e poi apachectl start per avviarlo. Questo ucciderà il tuo server per un certo periodo di tempo, ma farà anche in modo che tutti i processi bloccati su quello script andranno via.

4

Se è stato avviato in background, utilizzare ps aux | grep time.php per ottenere PID. Quindi solo kill PID. Se il processo è iniziato in primo piano, utilizzare per interromperlo.

Se il processo è stato avviato in Apache, riavviare Apache (/etc/init.d/apache2 restart per Debian). Se il processo è stato avviato con un server simile a CGI, riavviare il server.

7

Suppongo che tu non abbia accesso alla shell. Sospetto che il modo più semplice sia contattare l'amministratore e far riavviare Apache. Non vogliono più correre così come te.

Un'alternativa sarebbe quella di tentare di uccidere tutti i processi Apache utilizzando PHP. Invia un segnale di kill a tutti i processi di Apache, tranne quello in cui è in esecuzione. Questo potrebbe funzionare se il processo Apache è in esecuzione in un processo condiviso senza setuid(). Tentativo a proprio rischio.

<?php 
$cpid = posix_getpid(); 
exec("ps aux | grep -v grep | grep apache", $psOutput); 
if (count($psOutput) > 0) 
{ 
    foreach ($psOutput as $ps) 
    { 
     $ps = preg_split('/ +/', $ps); 
     $pid = $ps[1]; 

     if($pid != $cpid) 
     { 
      $result = posix_kill($pid, 9); 
     } 
    } 
} 
?> 
+0

Risposta perfetta, anche se non ha indicato quale processo uccidere mentre il mio script era in esecuzione con id diversi, ho annotato diversi pid restituiti e sembravano restituire degli ID ripetuti, tranne pochi, quindi dovettero ucciderne uno. – Abubakkar

19

Se non si dispone di accesso alla shell, allora l'unico modo è quello di chiedere l'administrater server per uccidere il processo.

Detto questo, c'è un modo semplice per creare uno script e le permettono di essere cancellato da qualsiasi altro script sullo stesso server, come segue:

<?php 
// at start of script, create a cancelation file 

file_put_contents(sys_get_temp_dir().'/myscriptcancelfile','run'); 

// inside the script loop, for each iteration, check the file 

if (file_get_contents(sys_get_temp_dir().'/myscriptcancelfile') != 'run') { 
    exit('Script was canceled') ; 
} 

// optional cleanup/remove file after the completion of the loop 

unlink(sys_get_temp_dir().'/myscriptcancelfile'); 

// To cancel/exit the loop from any other script on the same server 

file_put_contents(sys_get_temp_dir().'/myscriptcancelfile','stop'); 

?> 
+0

puoi spiegare cosa intendi per file di cancellazione, ho un probema simile – Abubakkar

+0

file_put_contents() mette un file chiamato "myscriptcancelfile" all'interno della cartella/tmp di PHP, che è scrivibile dall'utente globale PHP su quel server (potrebbe essere un nome qualsiasi specifico per il tuo script) con il contenuto di "run". Durante le iterazioni del ciclo, file_get_contents() controlla i contenuti. Se il contenuto è stato modificato in qualcosa di diverso da "Esegui" (ad esempio, da te per interrompere lo script), il ciclo termina. Per ripulire dopo il ciclo, si può fare lo scollegamento ('/ tmp/myscriptcancelfile'); –

+0

Brillante! Esattamente quello di cui avevo bisogno. –

2

di fermare la vostra script php in esecuzione puoi semplicemente inserire il seguente comando nel tuo terminale. Questo riavvierà il servizio Apache. (ultimo riavvio del servizio php).

sudo service apache2 restart 

Si potrebbe desiderare di includere timeout all'interno degli script in futuro.

+1

Non so perché sei così irrispettoso. Stack Overflow è una risorsa online aperta per aiutare a risolvere gli errori. Mi è capitato di incontrare lo stesso errore di quello pubblicato in questo thread il 21 febbraio ... ma ho sentito l'impulso di condividere la mia opinione su come può essere risolta in modo efficace in quanto l'ho risolta diversamente. Spero di non incontrarti di nuovo né i tuoi commenti arroganti. ... Mi ha sconvolto il fatto che avresti abbassato la mia risposta (che funziona a proposito) e lasciare un commento così doloroso. La domanda posta viene esaudita sia per la persona che chiede l'originale che per i nuovi visitatori di questa pagina. –

+0

Mi dispiace. Modifica la domanda in modo che io possa revocarla. :) – Richie

5

Di seguito si fermerà il processo in background (PHP):

sudo service apache2 stop 

per ricominciare apache:

sudo service apache2 start 

Per semplicemente ri-avviare Apache:

sudo service apache2 start 
Problemi correlati