2013-04-30 86 views
0

有沒有一種可靠的方式可以讓php cli腳本檢測到另一個php cli腳本是否正在運行?通過在這種情況下運行,我的意思是如果我在命令行中執行了ps aux | grep scriptname.php,它會自行返回一行。一個PHP cli腳本可以檢測到另一個PHP cli腳本是否正在運行?

然而,這個命令往往會在輸出中返回自己,所以我擔心如果我只是做一個exec('ps aux | grep scriptname.php',$output);它會返回一個誤報。

我正在檢測的腳本也會生成日誌條目,但在某些情況下,它會休眠5分鐘,因此在這種情況下,檢測其日誌條目似乎是一種粗略的檢測方法。

+1

爲什麼不使用鎖定文件來檢測多個調用? – Barmar 2013-04-30 08:46:17

+0

我永遠不知道是否要解決這個問題或根本問題。在這種情況下,我在回答中解決了這個問題,但我更喜歡Barmar使用鎖定文件的建議。 – leftclickben 2013-04-30 08:47:27

+0

@Barmar這不是一個多重調用問題,儘管鎖文件可能有效。在這種情況下,我認爲對於我來說,leftclickben的答案可能會減少我的工作...... :) – AntonChanning 2013-04-30 08:57:11

回答

2

這裏的leftclickben的回答稍微簡化版本。使用[]包裝腳本名稱中的一個字母可避免您必須過濾掉grep

exec('ps aux | grep "[s]criptname.php"', $output); 
+0

您確定嗎?我只是嘗試(在命令行上,而不是在PHP中),'echo「foo bar」| grep bar'然後'echo「foo bar」| grep「[b] ar」'並且在兩種情況下都受到了打擊。或者我錯過了什麼? – leftclickben 2013-04-30 09:04:02

+0

@leftclickben這個技巧只與gre的ps輸出有關。開始你的腳本,然後比較'ps aux | grep scriptname.php'與'ps aux | grep「[s] criptname.php」'。 – Barmar 2013-04-30 09:07:10

+1

* facepalm *當然 - 它使得'ps'命令實際上不包含「scriptname.php」,而是包含方括號的不同字符串。我學到了一些東西 - 謝謝:-)對這篇文章的第一評論有一個更完整的解釋:http://askubuntu.com/questions/153419/how-does-this-tricky-bracket-expression-in-grep-work – leftclickben 2013-04-30 09:13:45

1

您可以使用grep -v grep來篩選出「在輸出中返回自身」部分。也就是說,它只能找到scriptname.php那裏是不是也是在命令grep

exec('ps aux | grep scriptname.php | grep -v grep', $output); 
+0

過濾出'grep',但它不會過濾出正在檢查的腳本實例。 – Barmar 2013-04-30 08:45:32

+0

所以你只需要尋找兩行而不是一個......如果有一個,那麼它是唯一一個正在運行的,如果有兩個,那麼還有另一個。 – leftclickben 2013-04-30 08:46:26

+0

@Barmar被檢查的腳本被稱爲別的東西,所以在這種情況下它不應該檢測自己。這是一個很好的觀點,但是如果有人想要檢測相同的腳本是否已經在運行... – AntonChanning 2013-04-30 08:58:28

相關問題