2012-12-12 53 views
13

運行PHP腳本,我開始這個過程(time.php)如何停止的背景

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

,但我現在想停止它。它發送數百封郵件到我的Gmail a/c。它在Web服務器上,我不能重新啓動它來終止進程。

有沒有辦法執行另一個文件來殺死進程,或者我該怎麼辦?

+9

sudo service apache2 start 

要簡單地重新啓動Apache行'kill '。下次不啓動你不知道如何停止 – 2012-12-12 19:50:55

+0

你的主機是否允許你訪問控制檯(SSH)? –

+5

'ignore_user_abort(true);'+'while while(true);'+'mail' ='非常糟糕' – Baba

回答

0

你可以殺死正在運行的apache進程。嘗試運行諸如apachectl stop然後apachectl start以啓動備份。這會在一段時間內殺死你的服務器,但它也會確保任何停留在該腳本上的進程都將消失。

4

如果您在後臺啓動它,請使用ps aux | grep time.php來獲取PID。然後只是kill PID。如果進程在前臺啓動,請使用中斷它。

如果進程在Apache內啓動,請重新啓動Apache(Debian的/etc/init.d/apache2 restart)。如果進程從類CGI服務器開始,請重新啓動服務器。

7

我假設你沒有shell訪問權限。我懷疑最簡單的方法是聯繫管理員並讓他們重新啓動Apache。他們不希望這樣的跑步比你做得更多。

另一種方法是嘗試使用PHP來終止所有Apache進程。它會向所有Apache進程發送一個kill信號,除了它正在運行的進程之外。如果Apache進程在沒有setuid()的共享進程下運行,這可能會起作用。嘗試自己的風險。

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

完美的答案,雖然它沒有告訴我哪個程序要用不同的id運行,但我記下了不同的pid,並且它們似乎返回了一些重複的id,除了少數幾個,所以不得不殺死其中的一個。 – Abubakkar

19

如果您沒有shell訪問權限,那麼唯一的方法是要求服務器管理員終止進程。

話雖這麼說,沒有建立一個腳本,使它能夠在同一臺服務器上的任何其他腳本被取消的簡單方法如下:

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

你能解釋一下你的意思嗎?我有一個類似的探針 – Abubakkar

+0

file_put_contents()在PHP的/ tmp文件夾中放置一個名爲「myscriptcancelfile」的文件,該文件可由該服務器上的全局PHP用戶寫入(可以是任何名稱特定於您的腳本)與「運行」的內容。在循環迭代期間,file_get_contents()檢查內容。如果內容已被更改爲「運行」以外的任何內容(例如,通過您停止腳本),則循環退出。對於循環後的清理,你可以做unlink('/ tmp/myscriptcancelfile'); –

+0

輝煌!正是我需要的。 –

2

要停止你的PHP腳本運行您只需在終端中輸入以下命令即可。這將重新啓動Apache服務。 (最終重新啓動你的PHP服務)。

sudo service apache2 restart 

您可能希望在將來的腳本中包含超時值。

+1

我不知道你爲什麼如此不敬。堆棧溢出是幫助解決錯誤的開放式在線資源。我碰巧遇到了與2月21日發佈在此主題中相同的錯誤...但感受到分享我對如何有效解決問題的看法的衝動,因爲我已經以不同的方式解決了這個問題。我希望我不會再遇到你或者你的傲慢評論。 ......讓我不高興的是,你會投我的答案(順便說一句),並留下如此傷人的評論。提出的問題已經回答了原始人問及本頁面的新訪問者。 –

+0

對不起。編輯問題,以便我可以對它進行調整。 :) – Richie

5

下面將停止後臺進程(PHP):

sudo service apache2 stop 

要重新啓動Apache:從命令

sudo service apache2 start