2014-05-17 94 views
1

在一個shell腳本,我想等待一個特定的文件出現安全訪問inotified文件

inotifywait -m -r -q -e close_write -e moved_to --format '%w/%f' $ARCHIVE_ROOT | while read FILE; do 
# Call other programs which process the file like stat or sha1sum 
done 

我會認爲該文件是有效的,而在處理代碼。遺憾的是,文件似乎消失了,例如經sha1sum處理後。 我是否錯過了明顯的東西,這是使文件最後的必要條件?

回答

1

許多進程創建臨時文件並快速刪除它們。這是進步的本質。

爲了防止文件被刪除,而你的循環執行,使用鏈接:

inotifywait -m -r -q -e close_write -e moved_to --format '%w/%f' $ARCHIVE_ROOT | while read FILE; do 
    ln "$FILE" tmpfile$$ || continue 
    sha1sum tmpfile$$ 
    rm tmpfile$$ 
done 

如果while循環開始前的文件被破壞,有什麼可以做的。但是,如果它存在於循環的開始處,則使用硬鏈接將確保它只要您需要它就會繼續存在。

硬鏈接不停止其他進程更改文件。如果這是一個問題,那麼複製件(cp)是必要的。

爲此,臨時文件必須與原始文件在同一文件系統上。

如果此應用程序對安全敏感,則可能需要使用mktemp或其他此類實用程序來生成臨時文件的名稱。

+0

因此,'inotifywait'寧願返回文件的路徑和inode以安全地工作!? – abergmeier

+0

如果在inotifywait腳本有機會運行之前文件已被刪除,則擁有inode仍不能解決問題。 – John1024

+0

正確,但後來我會認爲inode直到所有的inotify回調都被調用後纔會被inffify(reeded)。 – abergmeier