Mac執(zhí)行定時任務(wù)之Launchctl
launchctl是一個統(tǒng)一的服務(wù)管理框架,啟動、停止和管理守護進程、應(yīng)用程序、進程和腳本。下面講述一下如何在Mac上使用launchctl執(zhí)行定時任務(wù)。
一、編寫一個plist文件
launchctl 將根據(jù)這個plist文件的信息來啟動任務(wù),plist文件中的關(guān)鍵字可以在 蘋果官方文檔 找到,值得注意的是 Label 對應(yīng)的值需要保證唯一性,作為任務(wù)的唯一標示??梢允褂萌缦旅顏眚炞Cplist格式的正確性(不代表命令有效):
$ plutil-lint /Users/denglibing/Library/LaunchAgents/com.denglibing.checkin.plist
這個是一個完整的 plist 文件:
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE plist PUBLIC "-//Apple//DTD PLIST 1.0//EN" "http://www.apple.com/DTDs/PropertyList-1.0.dtd">
<plist version="1.0">
<dict>
<key>Label</key>
<string>com.denglibing.checkin</string>
<key>RunAtLoad</key>
<true/>
<key>ProgramArguments</key>
<array> <string>/Users/denglibing/Desktop/denglibing_checkin/denglibing_checkin_request.sh</string>
</array>
<key>StartCalendarInterval</key>
<array>
<dict>
<key>Weekday</key>
<integer>1</integer>
<key>Hour</key>
<integer>8</integer>
<key>Minute</key>
<string>58</string>
</dict>
<dict>
<key>Weekday</key>
<integer>2</integer>
<key>Hour</key>
<integer>8</integer>
<key>Minute</key>
<string>52</string>
</dict>
</array>
<key>StandardOutPath</key>
<string>/Users/denglibing/Desktop/denglibing_checkin/outlog</string>
<key>StandardErrorPath</key>
<string>/Users/denglibing/Desktop/denglibing_checkin/errorlog</string>
</dict>
</plist>
二、編寫定時腳本
即上面plist文檔中的 denglibing_checkin_request.sh 腳本,以最簡單的為例 (打開腳本):
# denglibing_checkin_request.sh
$ open /Users/denglibing/Desktop/denglibing_checkin/denglibing_checkin_request.sh
值得注意的是,需要設(shè)置這個腳本為可執(zhí)行文件:
$ chmod a+x /Users/denglibing/Desktop/denglibing_checkin/denglibing_checkin_request.sh
三、plist文件的位置
* ~/Library/LaunchAgents 由用戶自己定義的任務(wù)項
* /Library/LaunchAgents 由管理員為用戶定義的任務(wù)項
* /Library/LaunchDaemons 由管理員定義的守護進程任務(wù)項
* /System/Library/LaunchAgents 由Mac OS X為用戶定義的任務(wù)項
* /System/Library/LaunchDaemons 由Mac OS X定義的守護進程任務(wù)項
建議放在 ~/Library/LaunchAgents 下面。
/System/Library和/Library和~/Library目錄的區(qū)別?
/System/Library目錄是存放Apple自己開發(fā)的軟件。
/Library目錄是系統(tǒng)管理員存放的第三方軟件。
~/Library/是用戶自己存放的第三方軟件。
LaunchDaemons和LaunchAgents的區(qū)別?
LaunchDaemons是用戶未登陸前就啟動的服務(wù)(守護進程)。
LaunchAgents是用戶登陸后啟動的服務(wù)(守護進程)。
四、加載命令
# 加載任務(wù), -w選項會將plist文件中無效的key覆蓋掉,建議加上
$ launchctl load -w com.denglibing.checkin.plist
# 刪除任務(wù)
$ launchctl unload -w com.denglibing.checkin.plist
# 查看任務(wù)列表, 使用 grep '任務(wù)部分名字' 過濾
$ launchctl list | grep 'com.denglibing'
五、總結(jié)
launchctl在定時啟動任務(wù)非常簡單和方便,值得注意的地方就是 plist 文件了。
1、Label:對應(yīng)的需要保證全局唯一性;
2、Program:要運行的程序;
3、ProgramArguments:命令語句
4、StartCalendarInterval:運行的時間,單個時間點使用dict,多個時間點使用 array <dict>
5、StartInterval:時間間隔,與StartCalendarInterval使用其一,單位為秒
6、StandardInPath、StandardOutPath、StandardErrorPath:標準的輸入輸出錯誤文件,這里建議不要使用 .log 作為后綴,會打不開里面的信息。
7、定時啟動任務(wù)時,如果涉及到網(wǎng)絡(luò),但是電腦處于睡眠狀態(tài),是執(zhí)行不了的,這個時候,可以定時的啟動屏幕就好了。