Mac中的定時(shí)任務(wù)利器:launchctl

launchctl是一個(gè)統(tǒng)一的服務(wù)管理框架,可以啟動(dòng)、停止和管理守護(hù)進(jìn)程、應(yīng)用程序、進(jìn)程和腳本等。
launchctl是通過配置文件來指定執(zhí)行周期和任務(wù)的。

當(dāng)然mac也可以像linux系統(tǒng)一樣,使用crontab命令來添加定時(shí)任務(wù),這里就不贅述,具體可參見:OS X 添加定時(shí)任務(wù)

下面將手把手教你在mac上創(chuàng)建定時(shí)任務(wù)。(任務(wù)目標(biāo):每天晚上十點(diǎn)定時(shí)執(zhí)行/Users/demo/helloworld.py的python程序)

1. 創(chuàng)建run.sh腳本

進(jìn)入 helloworld.py程序所在目錄
cd /User/demo
創(chuàng)建run.sh腳本
vi run.sh
添加執(zhí)行helloworld.py的命令

#!/bin/sh

# 記錄一下開始時(shí)間
echo `date` >> /Users/demo/log &&
# 進(jìn)入helloworld.py程序所在目錄
cd /Users/demo &&
# 執(zhí)行python腳本(注意前面要指定python運(yùn)行環(huán)境/usr/bin/python,根據(jù)自己的情況改變)
/usr/bin/python helloworld.py
# 運(yùn)行完成
echo 'finish' >> /Users/demo/log

:wq保存退出

注意,腳本要改成可執(zhí)行的權(quán)限
chmod 777 run.sh

2. 編寫plist文件

launchctl 將根據(jù)plist文件的信息來啟動(dòng)任務(wù)。
plist腳本一般存放在以下目錄:

  • /Library/LaunchDaemons -->只要系統(tǒng)啟動(dòng)了,哪怕用戶不登陸系統(tǒng)也會(huì)被執(zhí)行

  • /Library/LaunchAgents -->當(dāng)用戶登陸系統(tǒng)后才會(huì)被執(zhí)行

更多的plist存放目錄:

~/Library/LaunchAgents 由用戶自己定義的任務(wù)項(xiàng)
/Library/LaunchAgents 由管理員為用戶定義的任務(wù)項(xiàng)
/Library/LaunchDaemons 由管理員定義的守護(hù)進(jìn)程任務(wù)項(xiàng)
/System/Library/LaunchAgents 由Mac OS X為用戶定義的任務(wù)項(xiàng)
/System/Library/LaunchDaemons 由Mac OS X定義的守護(hù)進(jìn)程任務(wù)項(xiàng)

進(jìn)入~/Library/LaunchAgents,創(chuàng)建一個(gè)plist文件com.demo.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>
  <!-- Label唯一的標(biāo)識(shí) -->
  <key>Label</key>
  <string>com.demo.plist</string>
  <!-- 指定要運(yùn)行的腳本 -->
  <key>ProgramArguments</key>
  <array>
    <string>/Users/demo/run.sh</string>
  </array>
  <!-- 指定要運(yùn)行的時(shí)間 -->
  <key>StartCalendarInterval</key>
  <dict>
        <key>Minute</key>
        <integer>00</integer>
        <key>Hour</key>
        <integer>22</integer>
  </dict>
<!-- 標(biāo)準(zhǔn)輸出文件 -->
<key>StandardOutPath</key>
<string>/Users/demo/run.log</string>
<!-- 標(biāo)準(zhǔn)錯(cuò)誤輸出文件,錯(cuò)誤日志 -->
<key>StandardErrorPath</key>
<string>/Users/demo/run.err</string>
</dict>
</plist>

3. 加載命令

launchctl load -w com.demo.plist
這樣任務(wù)就加載成功了。

更多的命令:

# 加載任務(wù), -w選項(xiàng)會(huì)將plist文件中無效的key覆蓋掉,建議加上
$ launchctl load -w com.demo.plist

# 刪除任務(wù)
$ launchctl unload -w com.demo.plist

# 查看任務(wù)列表, 使用 grep '任務(wù)部分名字' 過濾
$ launchctl list | grep 'com.demo'

# 開始任務(wù)
$ launchctl start  com.demo.plist

# 結(jié)束任務(wù)
$ launchctl stop   com.demo.plist

如果任務(wù)唄修改了,那么必須先unload,然后重新load
start可以測試任務(wù),這個(gè)是立即執(zhí)行,不管時(shí)間到了沒有
執(zhí)行start和unload前,任務(wù)必須先load過,否則報(bào)錯(cuò)
stop可以停止任務(wù)

番外篇

plist支持兩種方式配置執(zhí)行時(shí)間:
  • StartInterval: 指定腳本每間隔多長時(shí)間(單位:秒)執(zhí)行一次;
  • StartCalendarInterval: 可以指定腳本在多少分鐘、小時(shí)、天、星期幾、月時(shí)間上執(zhí)行,類似如crontab的中的設(shè)置,包含下面的 key:
Minute <integer>
The minute on which this job will be run.
Hour <integer>
The hour on which this job will be run.
Day <integer>
The day on which this job will be run.
Weekday <integer>
The weekday on which this job will be run (0 and 7 are Sunday).
Month <integer>
The month on which this job will be run.
plist部分參數(shù)說明:
  1. Label:對應(yīng)的需要保證全局唯一性;
  2. Program:要運(yùn)行的程序;
  3. ProgramArguments:命令語句
  4. StartCalendarInterval:運(yùn)行的時(shí)間,單個(gè)時(shí)間點(diǎn)使用dict,多個(gè)時(shí)間點(diǎn)使用 array <dict>
  5. StartInterval:時(shí)間間隔,與StartCalendarInterval使用其一,單位為秒
  6. StandardInPath、StandardOutPath、StandardErrorPath:標(biāo)準(zhǔn)的輸入輸出錯(cuò)誤文件,這里建議不要使用 .log 作為后綴,會(huì)打不開里面的信息。
  7. 定時(shí)啟動(dòng)任務(wù)時(shí),如果涉及到網(wǎng)絡(luò),但是電腦處于睡眠狀態(tài),是執(zhí)行不了的,這個(gè)時(shí)候,可以定時(shí)的啟動(dòng)屏幕就好了。

更多的參數(shù)參見:mac官方文檔

參考:

Mac執(zhí)行定時(shí)任務(wù)之Launchctl

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請結(jié)合常識(shí)與多方信息審慎甄別。
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡書系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容