2012-12-12 13 views
13

zacząłem ten proces (time.php)Jak zatrzymać skrypt PHP uruchomionych na tle

<?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); 
?> 

ale teraz chcą go zatrzymać. Wysyła setki wiadomości do mojego konta Gmail. Jest na serwerze internetowym, gdzie nie mogę go ponownie uruchomić, aby zabić proces.

Czy istnieje sposób na wykonanie innego pliku w celu uśmiercenia procesu lub jak go wykonać?

+9

z poleceniem wiersz 'zabij '. A następnym razem nie zaczynaj tego, czego nie wiesz, jak przestać. –

+0

Czy twój komputer daje ci dostęp do konsoli (SSH)? –

+5

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

Odpowiedz

0

Możesz zabić proces apache uruchomiony. Spróbuj uruchomić coś takiego, jak apachectl stop, a następnie apachectl start, aby rozpocząć tworzenie kopii zapasowej. To zabije twój serwer przez pewien czas, ale będzie także zapewniał, że wszelkie procesy zablokowane w tym skrypcie znikną.

4

Jeśli uruchomiłeś go w tle, użyj ps aux | grep time.php, aby uzyskać PID. Następnie wystarczy kill PID. Jeśli proces rozpoczął się na pierwszym planie, użyj go, aby przerwać.

Jeśli proces rozpoczął się w Apache, uruchom ponownie Apache (/etc/init.d/apache2 restart dla Debiana). Jeśli proces rozpoczął się od serwera podobnego do CGI, zrestartuj serwer.

7

Zakładam, że nie masz dostępu do powłoki. Podejrzewam, że najłatwiej jest skontaktować się z administratorem i poprosić go o ponowne uruchomienie Apache. Nie chcą już tego biec, niż ty.

Jedną alternatywą byłoby próba zabicia wszystkich procesów Apache za pomocą PHP. Wyśle sygnał zabicia do wszystkich procesów Apache, z wyjątkiem tego, w którym działa. Może to działać, jeśli proces Apache działa w ramach współużytkowanego procesu bez metody setuid(). Próba na własne ryzyko.

<?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

Doskonała odpowiedź, choć nie wiadomo, który proces ma zostać zabity, ponieważ mój skrypt działał z innym identyfikatorem, zauważyłem, że różne pidy powróciły i zdawały się zwracać pewne powtórzenia ids, z wyjątkiem kilku, więc musiałem zabić jednego z nich. – Abubakkar

19

Jeśli nie masz dostępu do powłoki, jedynym sposobem jest poproszenie administratora serwera o zabicie procesu.

Mając na uwadze powyższe, istnieje łatwy sposób skonfigurować skrypt i umożliwić mu zostać anulowana z jakiegokolwiek innego skryptu na tym samym serwerze, co następuje:

<?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

czy możesz wyjaśnić, co masz na myśli przez plik anulowania, Mam podobne probem – Abubakkar

+0

file_put_contents() umieszcza plik o nazwie "myscriptcancelfile" wewnątrz folderu PHP/tmp, który jest zapisywalny przez globalnego użytkownika PHP na tym serwerze (może być dowolna nazwa specyficzne dla twojego skryptu) z zawartością "uruchom". Podczas iteracji pętli plik_get_contents() sprawdza zawartość. Jeśli zawartość została zmieniona na coś innego niż "uruchom" (powiedzmy, aby zatrzymać skrypt), pętla kończy działanie. Do czyszczenia po pętli, możesz zrobić rozłączenie ('/ tmp/myscriptcancelfile'); –

+0

Genialny! Dokładnie to, czego potrzebowałem. –

2

Aby zatrzymać skrypty php działa ci można po prostu wprowadzić następujące polecenie w terminalu. Spowoduje to ponowne uruchomienie usługi Apache. (ostateczne ponowne uruchomienie usługi php).

sudo service apache2 restart 

Możesz chcieć uwzględnić limity czasu w swoich skryptach w przyszłości.

+1

Nie wiem, dlaczego tak bardzo nie okazujesz szacunku. Stack Overflow to otwarty zasób online pomagający w rozwiązywaniu błędów. Zdarzyło mi się spotkać ten sam błąd, co w tym wątku 21 lutego ... ale poczułem chęć podzielenia się moim poglądem na temat tego, jak można go skutecznie rozwiązać, ponieważ rozwiązałem go inaczej. Mam nadzieję, że nie spotkam się ponownie ani waszych aroganckich komentarzy. ... Denerwuje mnie to, że głosujesz na moją odpowiedź (która działa tak jak trzeba) i zostawiasz tak bolesny komentarz. Na postawione pytanie odpowiada zarówno pierwotna osoba pytająca, jak i nowi goście na tej stronie. –

+0

Przepraszam. Zmodyfikuj pytanie, aby móc go zatwierdzić. :) – Richie

5

dodaje się zatrzyma proces tła (PHP):

sudo service apache2 stop 

Aby ponownie uruchomić apache:

sudo service apache2 start 

po prostu ponownie uruchomić apache:

sudo service apache2 start 
Powiązane problemy