2013-08-05 120 views
5

我已經安排了一個CRON,每五分鐘調用/執行一次PHP腳本。 PHP腳本執行以下任務殺死或停止執行由CRON啓動的PHP腳本?

  1. 檢查數據庫中的標誌值以確定前一次運行是否仍在執行。數據庫中值爲1表示進程仍在運行,而值爲0表示不是。
  2. 如果標誌值爲1,則退出PHP else繼續下一步。
  3. 將數據庫中的標誌值從0更新爲1.
  4. 執行業務邏輯。
  5. 將標誌值從1更新爲0,以便下一個CRON可以在用戶表中可用時執行。

到目前爲止,所有的工作都很好,這取決於用戶上傳數據的大小,平均過程需要35到40分鐘才能完成。

問題,無論如何殺死或停止執行一次由cron啓動的PHP腳本。可能是讓用戶停止執行,上傳新數據並等待CRON運行的按鈕。我可以照顧重置所有的標誌和數據,它只是殺死PHP腳本是我想弄明白的。

我做了一些谷歌和想通,我可以使用一些命令,如:

Killall -9 PHP 

殺死服務器上運行的所有PHP進程,但不知道如何通過PHP做到這一點。

回答

1

您可以嘗試system()exec(),但它可能不起作用(或返回權限被拒絕的錯誤),因爲cron進程由當前用戶或根執行,並且Web服務器用戶通常無權訪問這些進程。

4

試試這個:

ps aux |grep 'part_of_the_name_of_your_script'|awk '{print $2}' |xargs kill -9 {}

或者在crontab文件使用CRUN和可變CRUN_TIME 看到crun -h

+1

殺手一個襯墊,謝謝。 我得到'{}'的錯誤,當我刪除它時,命令有效。 –

1

一個lock file會非常適合這個任務。 PHP腳本可以嘗試創建一個新文件,如果沒有創建一個新文件,則可以安全地知道腳本是目前唯一運行的腳本。如果文件存在,您可以簡單地退出腳本。

例子:

<?php 

if (file_exists('/var/run/my-script')) { 
    exit(1); // already running 
} 

file_put_contents('/var/run/my-script', getmypid()); 

/** Business Logic **/ 

unlink('/var/run/my-script'); 
exit(0); 

?> 
+0

謝謝,但我不確定這是否能解決問題。你建議使用鎖定文件來檢查腳本是否已經運行。我能夠在數據庫標誌的幫助下管理它(效率不高,但現在正在工作)。我正在尋找的是一種腳本開始處理業務邏輯後停止執行的方法。 – Saurabh