2008-09-01 47 views
5

有沒有簡單的方法來判斷ruby腳本是否已經運行,然後適當地處理它?例如:我有一個名爲really_long_script.rb的腳本。我讓它每5分鐘運行一次。當它運行時,我想看看上一次運行是否仍在運行,然後停止執行第二個腳本。有任何想法嗎?確定ruby腳本是否已經運行

回答

9

的PS是那樣做,可能開放競爭條件的真正的窮人的方式。

傳統的Unix/Linux方式是將PID寫入文件(通常位於/ var/run),並檢查啓動時是否存在該文件。

例如pidfile位於/var/run/myscript.pid,那麼在運行程序之前,你會檢查它是否存在。有一些技巧可以避免使用O_EXCL(異步鎖定)來打開文件和符號鏈接的競爭條件。

但是不太可能,您應該嘗試編碼以通過在文件系統上使用原子操作來避免競爭條件。

爲了節省重新發明輪子,你可能想看看http://rubyforge.org/projects/pidify/

0

在bash:

if ps aux | grep really_long_script.rb | grep -vq grep 
then 
    echo Script already running 
else 
    ruby really_long_script.rb 
fi 
0

你或許應該還檢查過程實際上是運行的,所以如果你的腳本死亡,沒有自我整頓,它將運行下一次,而不是簡單地檢查 /var/run/foo.pid是否存在並退出。

0

Highlander

說明

,可以確保只有一個主腳本的實例在運行的瑰寶。 總之,只能有一個。

安裝

gem install highlander 

簡介

require 'highlander' # This should be the -first- thing in your code. 
# Your code here 

同時,早在命令行上...

# First attempt, works. Assume it's running in the background. 
ruby your_script.rb 

# Second attempt while the first instance is still running, fails. 
ruby your_script.rb # => RuntimeError 

只簡單地要求漢蘭達寶石確保塔t該腳本只有一個實例 不能再次啓動。如果您嘗試再次啓動它 它會引發RuntimeError。

相關問題