2016-01-22 38 views
3

我想觀看Ubuntu 14.04中的目錄,並且在此目錄中創建新文件時,請運行腳本。linux - 觀察新文件的目錄,然後運行腳本

具體來說,我有安全攝像頭,通過FTP上傳捕獲的視頻,當他們檢測到運動。我想在這個FTP服務器上運行一個腳本,這樣當創建新文件時,他們立即鏡像(上傳)到雲存儲服務,這是通過我已經編寫的腳本完成的。

我發現iWatch讓我這樣做(http://iwatch.sourceforge.net/index.html) - 我遇到的問題是iwatch在FTP目錄中即時創建文件時立即啓動雲上傳腳本,即使文件正在處理中仍然上傳。這會導致雲同步腳本上傳0字節的文件,對我無用。

我可以添加在雲中上傳腳本可能是「等待」,但它似乎下鍋y和無法預測需要等待多長時間,因爲它取決於文件大小,網絡條件等

請告訴我一個更好的辦法去做這個?

回答

0

您已接近解決方案。你可以用iwatch觀看很多不同的活動 - 你感興趣的是close_write。語法:

iwatch -e close_write <directory_name> 

當然這隻有文件的時候寫的完整的,它們雖然這是一個理智的假設,它不一定是一個真實的(但往往是)被關閉。

+0

謝謝,我也嘗試過。還嘗試使用inotifywait -e close_write作爲上傳腳本中的「等待」。不幸的是沒有一個按預期工作。我猜是因爲由於某些原因上傳到vsftpd的文件沒有正確的關閉或close_write。我可能會在文件上嘗試一些像'ls -al'這樣的hack-y內容,並等待X秒,直到文件大小停止更改,然後繼續。看起來像一個可怕的解決方案,雖然 –

+0

現在我決定,而不是做我的計劃和雲同步文件,只要他們上傳到FTP,我運行一個小時cron上傳文件到雲存儲如果它沒有看到已經存在的文件。因此,如果次優解決方案是可以接受的。 –

1

儘管在評論中提到了inotifywait,但完整的解決方案可能對其他人有用。這似乎是工作:

inotifywait -m -e close_write /tmp/upload/ | gawk '{print $1$3; fflush()}' | xargs -L 1 yourCommandHere 

將運行

yourCommandHere /tmp/upload/filename 

當新上傳的文件被關閉

注:

  • inotifywait是Ubuntu的apt軟件包inotify-tools的一部分。它使用內核的inotify服務監控文件或目錄事件
  • -m選項監控模式下,輸出每個事件一行到標準輸出
  • -e close_write對於那個曾經打開寫入文件的文件關閉事件。文件關閉事件有望避免接收不完整的文件。
  • /tmp/upload可以與一些其他目錄被替換以監測
  • 管到gawk重新格式化inotifywait輸出線掉落第二列,該列是事件類型的重複。它結合了第1列的目錄名與第3列中的文件名進行新線,這被刷新每行由xargs
  • xargs擊敗緩衝和鼓勵立即採取行動,採取文件的列表,併爲每個文件運行指定的命令,在命令的末尾附加文件名。 -L 1導致xargs在標準輸入收到的每一行後運行。