簡體   English   中英

用於監視新文件目錄的bash腳本

[英]bash script which watches directory for new files

重要的是要注意立即有很多變體的'腳本來觀看目錄'我意識到inotify-tools是理想的,但是這個特殊的腳本被用來監視vboxsf文件系統,遺憾的是它不轉發文件系統通知。 這個腳本是一個刷新文件的黑客,所以一個單獨的運行守護進程會注意到它。

下面的腳本是妥協。 我花了很長時間處理各種問題

  1. 正確的find args
  2. find路徑和
  3. 觸摸找到的文件的時間。

目標是識別新文件,觸摸它,以便單獨的運行守護程序注意到它並隨后處理它。 問題是,它吞噬了cpu並且可能來自發現。 我想幫助找到一種更有效的方法。

雖然沒有必要,但要完全測試,需要一個已安裝的vboxsf文件系統,其中inotifywait運行如此inotifywait -m /watches/watchdir -e attrib

在文件以某種方式刷新之前,主機端的文件創建不會在客戶端產生ATTRIB通知 - 在這種情況下,此hack使用' touch '

thedir=/watches/watchdir

touch_me() {
    if [ "${newbie}" ]; then
 #  echo "got this: ${newbie}"
    touch -d '-120 seconds' "${newbie}"
    fi
}

while true
do
    newbie=`find $thedir/* -type f -mmin 0.1 2>/dev/null`
    touch_me
done

我相信,主機端的文件系統類型不是vboxsf

因此, inotify-tools可以在主機服務器端使用,對嗎?

假設從主機服務器端touch新創建的文件沒有效果,那么?

在主機服務器端創建新文件時, inotify-tools可以使用VBoXManage對guest VBoXManage執行touch命令,例如:

$ VBoxManage guestcontrol execute vmname /usr/bin/touch --username root --password 'changeme' --arguments "-d '-120 seconds' /watches/watchdir/${newbie}"

你怎么看?

否則你的腳本沒問題,但它正在使用輪詢。 因此,在這種情況下可能需要sleep ,有可能錯過一些新創建的文件......

sysdig這樣的工具可能會有所幫助。 例如,以下命令顯示/ tmp中發生的每個文件打開:

sysdig evt.type=open and fd.name contains /tmp

此工具非常復雜但功能強大,通過閱讀其手冊,您可以找到解決問題的有效方法。

循環不斷運行而不需要這樣做

find $thedir/* -type f -mmin 0.1

會在6秒前發現文件不再發生變化(未來不會超過55秒但不太可能自然發生)。 假設find運行的時間少於一秒(除非你有數千個文件),你可能想在循環中插入一個sleep 5。 另一件事是你為什么要把時間花在2分鍾后才能找到你發現的最近更改的文件...當然,任何在2分鍾內沒有改變的東西都處於相同的狀態。 用一個很少使用的屬性(比如'no dump')來標記文件是不是更好的選擇,這樣另一個惡魔就不會無意中看到那些看起來像是被腳本觸及的文件但不是?

而不是使用find進行密集循環,可以選擇執行類似這樣的操作(將touch_me保留到-2min,以便其他守護進程檢測):

touch_me() {
  #  echo "got this: $1"
  touch -d '-120 seconds' $1
}

touch /tmp/file.ref
while true
do
  for FILE in $thedir/*
  do
    [ $FILE -nt /tmp/file.ref ] && touch_me $FILE
  done
  touch /tmp/file.ref
  sleep 60
done

這樣,while的每次迭代都將查找在上一次迭代之后已修改的文件。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM