2014-01-06 103 views
3

我有一個php腳本文件,每30秒運行一次cron作業並運行幾分鐘。我想限制它,所以只有最大數量的X實例可以同時運行,因此如果腳本的X數量已經運行,新啓動的腳本將退出,並且當一個或多個運行腳本完成下一個cron時然後才能成功啓動腳本。php腳本可以從cron運行的實例數量有限

我發現了一些關於這方面的信息,但主要是限制爲只有一個實例,就像一個互斥體。所以我想在我可以使用什麼樣的解決方案來實現我所需要的,這裏有一些想法我有:

  • 使用MySQL數據庫跟蹤腳本執行
  • 保存的PID到文件,刪除PID當劇本完成
  • 運行簡單的PS + grep命令

林向使用ps命令方法靠在因爲似乎是代碼的更容易。有人知道更好的方法嗎?

+1

你是如何運行的,每30秒時的cron只支持粒度到分鐘?你能談談你實際上想要達到什麼嗎?因爲這種方法可能會避免altoghether。 –

+0

爲什麼不爲每個實例創建一個文件?例如,我最多隻需要一個實例。我創建了一個文件。當cron開始時 - 如果文件存在 - 不運行任務。如果不存在 - 創建文件,運行任務,刪除文件。 –

回答

0

IMO,你最好的選擇是ps + grep命令。

MySQL和pid解決方案都可以工作,但是無論何種理由,腳本總是有可能在完成之前死掉,因此給您的計數器不會代表任何給定時間運行的腳本數量。

0

使用 「PS U」:

if(ifFirstInstance()==false){ 
    echo "ERROR: script already running.\n"; 
    die; 
    } 

//continue here 

function ifFirstInstance(){ 
    $basename = basename($_SERVER['SCRIPT_NAME']); 
    ob_start(); 
    system("ps u", $return); 
    $result = ob_get_contents(); 
    ob_end_clean(); 
    $pieces = count(explode($basename, $result)); 
    $pieces--; 
    if($pieces < 2) 
     return true; 
    else 
     return false; 
    }