在linux下執行定期任務可以使用crontab,目前mac os也可以使用它,不過已不推薦使用。推薦做法是採用plist腳本,plist腳本可以設置執行的動作,時間間隔等其他一些信息。另外crontab的最小時間間隔是一分鐘,使用plist腳本原則上時間間隔可以爲一秒。
plist腳本存放路徑爲/Library/LaunchDaemons或/Library/LaunchAgents,其區別是後一個路徑的腳本當用戶登陸系統後纔會被執行,前一個只要系統啓動了,哪怕用戶不登陸系統也會被執行。
可以通過兩種方式來設置腳本的執行時間。一個是使用StartInterval,它指定腳本每間隔多長時間(單位:秒)執行一次;另外一個使用StartCalendarInterval,它可以指定腳本在多少分鐘、小時、天、星期幾、月時間上執行,類似如crontab的中的設置。
一個簡單例子如下:
其中key是plist腳本定義的屬性,緊跟着的下一行是該屬性對應的值。上述腳本是每間隔60秒執行一次/Users/yangyz/plist-test.sh這個shell腳本,也可以使用StartCalendarInterval來替換StartInterval達到同樣的效果,例如:
上述設置的意思爲每天的每個小時的第0分鐘執行,也即使每60秒執行一次。
plist腳本中定義的屬性以及具體的含義,可以參看蘋果官方網站的說明,地址爲:launchd.plist(5) Mac OS X Manual Page
launchctl命令可以控制plist腳本停止或重新加載。例如:
如果執行上面命令看到launchctl: Dubious ownership on file (skipping): /Library/LaunchDaemons/com.yangyz.cron.test.plist這樣的錯誤,其原因是該腳本的owner和當前執行操作用戶不一致。使用chown修改一下即可。
如果修改完用戶和所屬組以後,依然報“launchctl: Dubious ownership on file(skipping):/Library/LaunchDaemons/com.yangyz.cron.test.plist”這樣的錯誤,可以在修改一下plist文件的權限:"sudo chmod 644 /Library/LaunchDaemons/com.yangyz.cron.test.plist"後,再次啓動腳本。
參考資料:
http://www.devdaily.com/mac-os-x/launchd-plist-examples-startinterval-startcalendarinterval
http://www.devdaily.com/mac-os-x/mac-osx-startup-crontab-launchd-jobs