在linux下執行定期任務可以使用crontab,目前mac os也可以使用它,不過已不推薦使用。推薦做法是采用plist腳本,plist腳本可以設置執行的動作,時間間隔等其他一些信息。另外crontab的最小時間間隔是一分鍾,使用plist腳本原則上時間間隔可以為一秒。
plist腳本存放路徑為/Library/LaunchDaemons或/Library/LaunchAgents,其區別是后一個路徑的腳本當用戶登陸系統后才會被執行,前一個只要系統啟動了,哪怕用戶不登陸系統也會被執行。可以通過兩種方式來設置腳本的執行時間。一個是使用StartInterval,它指定腳本每間隔多長時間(單位:秒)執行一次;另外一個使用StartCalendarInterval,它可以指定腳本在多少分鍾、小時、天、星期幾、月時間上執行,類似如crontab的中的設置。
一個簡單例子如下:
1 <?xml version="1.0" encoding="UTF-8"?> 2 <!DOCTYPE plist PUBLIC "-//Apple//DTD PLIST 1.0//EN" "http://www.apple.com/DTDs/PropertyList-1.0.dtd"> 3 <plist version="1.0"> 4 <dict> 5 <key>Label</key> 6 <string>com.yangyz.cron.test.plist</string> 7 <key>ProgramArguments</key> 8 <array> 9 <string>/Users/yangyz/plist-test.sh</string> 10 </array> 11 <key>KeepAlive</key> 12 <false/> 13 <key>RunAtLoad</key> 14 <true/> 15 <key>StartInterval</key> 16 <integer>60</integer> 17 </dict> 18 </plist>
其中key是plist腳本定義的屬性,緊跟着的下一行是該屬性對應的值。上述腳本是每間隔60秒執行一次/Users/yangyz/plist-test.sh這個shell腳本,也可以使用StartCalendarInterval來替換StartInterval達到同樣的效果,例如:
<key>StartCalendarInterval</key> <dict> <key>Minute</key> <integer>0</integer> </dict>
上述設置的意思為每天的每個小時的第0分鍾執行,也即使每60秒執行一次。
plist腳本中定義的屬性以及具體的含義,可以參看蘋果官方網站的說明,地址為:launchd.plist(5) Mac OS X Manual Page
launchctl命令可以控制plist腳本停止或重新加載。例如:
#停止腳本com.yangyz.cron.test.plist運行 launchctl unload /Library/LaunchDaemons/com.yangyz.cron.test.plist #啟動腳本com.yangyz.cron.test.plist運行 launchctl load /Library/LaunchDaemons/com.yangyz.cron.test.plist
如果執行上面命令看到launchctl: Dubious ownership on file (skipping): /Library/LaunchDaemons/com.yangyz.cron.test.plist這樣的錯誤,其原因是該腳本的owner和當前執行操作用戶不一致。使用chown修改一下即可。
參考資料:
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