2015-04-15 34 views
1

如果服務器上的員工文件夾中的文件發生更改,我想向我們公司的員工發送電子郵件通知。 我有一個腳本,可以在使用inotifywait發送每個文件更改的電子郵件時正常工作。 我想要做的是在多個文件上傳(可以說10個JPG正在上傳到某人的員工文件夾)只發送一封電子郵件。在受監視目錄中的文件更改上發送電子郵件

該腳本將每個文件變更電子郵件:

inotifywait --recursive --exclude '.DS_Store' -e create -e moved_to -m /media/server/Staff/christoph | 
    while read path action file ; do 
     echo "The file '$file' appeared in directory '$path' via '$action'" 
     sendEmail -f [email protected] -t [email protected] -s smtpout.secureserver.net:80 -xu [email protected] -xp password \ 
     -u ""The file $file appeared in your directory"" -m ""To view your file go to $path"" 
done 

什麼是去了解這個最聰明的方法是什麼?讓我們說等待2分鐘的進一步輸入是否有意義?

順便說一下,我使用sendemail,因爲端口25被ISP阻止。

回答

1

我很可能會通過將修改通知寫入文件(如果我這樣做,我可能會使用SQLite數據庫),然後每隔幾分鐘運行一次cron作業以檢查數據庫併發送聚合的電子郵件。

另一種選擇是使用inotifywait觸發腳本來觀察特定文件,它只是循環檢查文件的大小/修改時間,然後休眠一段時間。一旦文件停止增長,腳本會將文件信息附加到消息文件中。 cron作業將發送消息文件(如果它不是空的),則截斷該文件。這將避免需要從日誌文件讀取和寫入數據。

+0

謝謝安迪,我正在考慮創建一個日誌文件併發送出去。問題在於,自從我們開始製作視頻並且文件很大時,文件傳輸可能需要長達20分鐘的時間。我想知道是否可以從netatalk服務器獲取輸出以查看文件傳輸是否正在進行?我怎樣才能防止腳本發送多封電子郵件? – mrchrister

+1

取決於文件傳輸的工作方式,您可能會從查看「創建」更改爲「close_write」。如果文件傳輸是通過單個文件打開和關閉完成的,這將工作。爲此使用數據庫,您還可以添加一個標誌,確定電子郵件是否已發送,並檢查跟蹤cron作業運行之間的文件大小和修改時間,並且僅在大小和修改時間停止後才發送電子郵件改變。 –

+0

再次感謝安迪!我正在嘗試一個日誌文件。 close_write做了奇怪的事情..就像不斷髮布文件夾中的每個文件,所以我猜這在這種情況下不起作用。由於數據庫和SQL可能遠遠超出我的頭,我有輸出寫入日誌文件。在日誌文件中檢查新行的好方法是什麼,如果不同,請發送電子郵件給用戶?我會使用tail -n 1,然後是if語句嗎? – mrchrister

相關問題