2012-11-29 38 views
0

我正在開發一個應用程序。我使用的操作系統是linux。如果可能的話,我需要運行目錄中創建的文件的ruby腳本。我需要保持這個腳本始終運行。我想到的第一件事是通知:每次在linux中的目錄中創建一個新文件時運行一個進程

inotify API提供了監視文件系統事件的機制。 Inotify可用於監視單個文件或監視目錄。

這正是我需要的,然後我發現「rb-inotify」,一個包裝冷杉inotify。

你認爲有什麼比使用inotify更好的做我需要的嗎?另外,我真的不明白我必須使用rb-inotify的方式。

我剛剛創建,例如,一個RB文件有:

notifier = INotify::Notifier.new 
notifier.watch("directory/to/check",:create) do |event| 
    #do task with event.name file 
end 

notifier.run 

然後我ruby myRBNotifier.rb,它會留循環,直到永遠。我該如何阻止它?任何想法?這是一個好方法嗎?

+0

我該如何阻止它? ctrl-c – froderik

+0

'這正是我需要的' - '我需要保持這個腳本始終運行......'''我該如何阻止它?'不知道問題出在哪裏? – AJcodez

回答

2

我建議你看看god。它專爲這類任務而設計,並且使構建後臺和守護程序應用程序的監控系統變得非常簡單。

至於主代碼本身,inotify不是跨平臺的,所以如果你有可能需要在Windows或Mac OS上運行,那麼你需要一個不同的解決方案。編寫一小段代碼可以定期檢查目標目錄是否有變化,這並不難。如果您需要知道更改的內容,請閱讀並緩存目錄條目,然後在您的代碼下次運行時進行比較。在運行之間使用sleep以在循環之前等待一段時間。

做類似事情的老派方法是使用cron定期發射工作。這項工作可以是你的腳本,通過將文件列表與緩存版本進行比較來檢查文件列表是否發生了變化,然後在需要的情況下根據需要採取行動。

0

只需在後臺與

ruby myRBNotifier.rb & 

運行腳本,當你需要停下來,找進程ID和使用殺它:

ps ux 
kill [whatever pid your process gets from the OS] 

是否回答你的問題?

+0

在後臺運行它只會在會話連接時起作用。如果用戶註銷或他們的會話中斷,則應用程序將被終止。 'screen'可以用來允許分離和重新連接,但是這使解決方案變得複雜。 –

0

如果您在mac/unix機器上運行,請查看launchctlman page。只要文件發生變化,您就可以設置一個進程來運行和執行ruby腳本。它高度可配置。

相關問題