Ubuntu 若檔案這樣,就那樣的好物 inotify-tools
不知道大家有沒有聽過 IFTTT (IF this, Then That) 這套工具呢?看字面的翻譯就是,如果這樣,就那樣,當某個條件達到,就觸發設定好的另一個條件。小蛙隨便舉個例子,例如:小蛙的網站掛了,就發送 email 通知,又或是如果小蛙發了一篇文章,就自動將這篇文章分享到各大社交軟體上 … 等等之類的,但是小蛙今天要講的不是 IFTTT,而是 inotify-tools,雖然不像 IFTTT 那樣方便及多功能,但可以很輕鬆又省力的自動化一些流程。
嚴格來說 inotify-tools 的功能是,監控檔案或資料夾,當被監控的檔案或資料夾發生新增/修改/刪除等變化時,系統會自動做一些相對應的動作。舉個簡單的應用,小蛙要監控某個資料夾,當資料夾新增了檔案,就把這個檔案移動到特定地方或是 rsync 上傳到某個地方 … 等等之類的。
小蛙當初會使用 inotify-tools 是因為蛙齋使用了大量的 cache 功能,但是當文章更新後,頁面卻沒有因此跟著改變,因此希望有一個機制,來自動做到這件事情,等等會額外提到 wordpress 的 hook 功能,不理解沒有關係,只要看過去就可以了。
運作流程
- 小蛙的 cache 放在 /var/cache/nginx 及 /var/cache/ngx_pagespeed_cache
- inotify-tools 可以監控某個特定的資料夾是否有出現新建檔案
- WordPress 有兩個 hook,
transition_post_status
及transition_comment_status
可以在小蛙文章更新時及有訪客留言時,觸發特定事件,小蛙就在這兩個事件發生的情況下,在 inotify-tools 監控的路徑下產生一個檔案 CLEAN_CACHE 當作啟動的 flag - 當 inotify-tools 偵測到有檔案產生,則自動去 rm -rf 上述兩個路徑下的 cache
- 做完清理 cache 並且重新 reload nginx 之後,清除 CLEAN_CACHE 這個 flag
上面可以看出來小蛙是偵測一個資料夾有沒有多 CLEAN_CACHE 這個檔案,其實小蛙本來是要偵測 CLEAN_CACHE 這個檔案有沒有被刪掉,但後來不知道怎麼搞得一直失敗,之後改成監控有沒有檔案增加,就成功了。
監控腳本
while true do inotifywait -e create /var/cache/nginx/ && /root/clean_reload done
自動偵測 /var/cache/nginx/ 資料夾下有沒有多出檔案,因為 /var/cache/nginx/ 下的快取全部都在子資料夾中,因此如果有增加檔案,一定是上面提到的 CLEAN_CACHE 這個檔案,不然只要有檔案增加就會觸發,一定要注意。
inotify-tools 觸發之後會執行 && 後面的 script,主要是做刪除快取、重啟 nginx 以及把 CLEAN_CACHE 檔案刪除,這樣下次文章有變動時,Wordpress hook 會去建立 CLEAN_CACHE 檔案,inotify-tools 監控到有檔案新增,就再去執行 clean_reload 動作,下面是 clean_reload 腳本
清除並重設腳本
開機啟動
最後,還有最後一步,當然就是開機執行啦!只要在 /etc/rc.local
的 exit 0
之前加上
nohup /root/inotify &
如此一來就大功告成囉!inotify-tools 真的是個自動化的好工具~