不知道大家有沒有聽過 IFTTT (IF this, Then That) 這套工具呢?看字面的翻譯就是,如果這樣,就那樣,當某個條件達到,就觸發設定好的另一個條件。小蛙隨便舉個例子,例如:小蛙的網站掛了,就發送 email 通知,又或是如果小蛙發了一篇文章,就自動將這篇文章分享到各大社交軟體上 … 等等之類的,但是小蛙今天要講的不是 IFTTT,而是 inotify-tools,雖然不像 IFTTT 那樣方便及多功能,但可以很輕鬆又省力的自動化一些流程。

嚴格來說 inotify-tools 的功能是,監控檔案或資料夾,當被監控的檔案或資料夾發生新增/修改/刪除等變化時,系統會自動做一些相對應的動作。舉個簡單的應用,小蛙要監控某個資料夾,當資料夾新增了檔案,就把這個檔案移動到特定地方或是 rsync 上傳到某個地方 … 等等之類的。

小蛙當初會使用 inotify-tools 是因為蛙齋使用了大量的 cache 功能,但是當文章更新後,頁面卻沒有因此跟著改變,因此希望有一個機制,來自動做到這件事情,等等會額外提到 wordpress 的 hook 功能,不理解沒有關係,只要看過去就可以了。

運作流程

  1. 小蛙的 cache 放在 /var/cache/nginx 及 /var/cache/ngx_pagespeed_cache
  2. inotify-tools 可以監控某個特定的資料夾是否有出現新建檔案
  3. WordPress 有兩個 hook,transition_post_statustransition_comment_status可以在小蛙文章更新時及有訪客留言時,觸發特定事件,小蛙就在這兩個事件發生的情況下,在 inotify-tools 監控的路徑下產生一個檔案 CLEAN_CACHE 當作啟動的 flag
  4. 當 inotify-tools 偵測到有檔案產生,則自動去 rm -rf 上述兩個路徑下的 cache
  5. 做完清理 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 腳本

清除並重設腳本

#!/bin/bash
# 刪除快取
rm -rf /var/ngx_pagespeed_cache/* /var/cache/nginx/fastcgi_temp/*
# 暫停一下,也可以不要暫停
sleep 3
# 刪除快取之後,會造成 nginx 異常,因此要重啟 nginx
/usr/local/nginx/sbin/nginx -s reload
# 寫 log,也可以拿掉不寫
echo $(date +%Y-%m-%d" "%H:%M:%S)" 清除快取" >> /var/log/inotify
# 刪除 CLEAN_CACHE 等待下次更新
rm -f /var/cache/nginx/CLEAN_CACHE

開機啟動

最後,還有最後一步,當然就是開機執行啦!只要在/etc/rc.localexit 0之前加上

nohup /root/inotify &

如此一來就大功告成囉!inotify-tools 真的是個自動化的好工具~

發表迴響

你的電子郵件位址並不會被公開。 必要欄位標記為 *