1. 程式人生 > >Mac中的定時任務利器:launchctl

Mac中的定時任務利器:launchctl

launchctl是一個統一的服務管理框架,可以啟動、停止和管理守護程序、應用程式、程序和指令碼等。
launchctl是通過配置檔案來指定執行週期和任務的。

當然mac也可以像linux系統一樣,使用crontab命令來新增定時任務,這裡就不贅述,具體可參見:OS X 新增定時任務

下面將手把手教你在mac上建立定時任務。(任務目標:每天晚上十點定時執行/Users/demo/helloworld.py的python程式)

1. 建立run.sh指令碼

進入 helloworld.py程式所在目錄
cd /User/demo
建立run.sh指令碼
vi run.sh
新增執行helloworld.py的命令

#!/bin/sh
# 記錄一下開始時間 echo `date` >> /Users/demo/log && # 進入helloworld.py程式所在目錄 cd /Users/demo && # 執行python指令碼(注意前面要指定python執行環境/usr/bin/python,根據自己的情況改變) /usr/bin/python helloworld.py # 執行完成 echo 'finish' >> /Users/demo/log

:wq儲存退出

注意,指令碼要改成可執行的許可權
chmod 777 run.sh

2. 編寫plist檔案

launchctl 將根據plist檔案的資訊來啟動任務。
plist指令碼一般存放在以下目錄:

  • /Library/LaunchDaemons -->只要系統啟動了,哪怕使用者不登陸系統也會被執行

  • /Library/LaunchAgents -->當用戶登陸系統後才會被執行

更多的plist存放目錄:

~/Library/LaunchAgents 由使用者自己定義的任務項
/Library/LaunchAgents 由管理員為使用者定義的任務項
/Library/LaunchDaemons 由管理員定義的守護程序任務項
/System/Library/LaunchAgents 由Mac OS X為使用者定義的任務項
/System/Library/LaunchDaemons 由Mac OS X定義的守護程序任務項

進入~/Library/LaunchAgents

,建立一個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唯一的標識 -->
  <key>Label</key>
  <string>com.demo.plist</string>
  <!-- 指定要執行的指令碼 -->
  <key>ProgramArguments</key>
  <array>
    <string>/Users/demo/run.sh</string>
  </array>
  <!-- 指定要執行的時間 -->
  <key>StartCalendarInterval</key>
  <dict>
        <key>Minute</key>
        <integer>00</integer>
        <key>Hour</key>
        <integer>22</integer>
  </dict>
<!-- 標準輸出檔案 -->
<key>StandardOutPath</key>
<string>/Users/demo/run.log</string>
<!-- 標準錯誤輸出檔案,錯誤日誌 -->
<key>StandardErrorPath</key>
<string>/Users/demo/run.err</string>
</dict>
</plist>

3. 載入命令

launchctl load -w com.demo.plist
這樣任務就載入成功了。

更多的命令:

# 載入任務, -w選項會將plist檔案中無效的key覆蓋掉,建議加上
$ launchctl load -w com.demo.plist

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

# 檢視任務列表, 使用 grep '任務部分名字' 過濾
$ launchctl list | grep 'com.demo'

# 開始任務
$ launchctl start  com.demo.plist

# 結束任務
$ launchctl stop   com.demo.plist

如果任務唄修改了,那麼必須先unload,然後重新load
start可以測試任務,這個是立即執行,不管時間到了沒有
執行start和unload前,任務必須先load過,否則報錯
stop可以停止任務

番外篇

plist支援兩種方式配置執行時間:
  • StartInterval: 指定指令碼每間隔多長時間(單位:秒)執行一次;
  • StartCalendarInterval: 可以指定指令碼在多少分鐘、小時、天、星期幾、月時間上執行,類似如crontab的中的設定,包含下面的 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部分引數說明:
  1. Label:對應的需要保證全域性唯一性;
  2. Program:要執行的程式;
  3. ProgramArguments:命令語句
  4. StartCalendarInterval:執行的時間,單個時間點使用dict,多個時間點使用 array <dict>
  5. StartInterval:時間間隔,與StartCalendarInterval使用其一,單位為秒
  6. StandardInPath、StandardOutPath、StandardErrorPath:標準的輸入輸出錯誤檔案,這裡建議不要使用 .log 作為字尾,會打不開裡面的資訊。
  7. 定時啟動任務時,如果涉及到網路,但是電腦處於睡眠狀態,是執行不了的,這個時候,可以定時的啟動螢幕就好了。

參考:

相關推薦

Mac定時任務利器launchctl

launchctl是一個統一的服務管理框架,可以啟動、停止和管理守護程序、應用程式、程序和指令碼等。launchctl是通過配置檔案來指定執行週期和任務的。當然mac也可以像linux系統一樣,使用crontab命令來新增定時任務,這裡就不贅述,具體可參見:OS X 新增定時任務下面將手把手教你在mac上建立

linux系統定時任務

linu tab 一次 腳本 lin edi 路徑 執行 表示 1、查看所有定時任務:命令:“crontab -l” 數字意思解釋如下:從左到右,依次是:分、時、日、月、星期。 2、編輯定時執行計劃:命令:"crontab -e" ,e表示edit修改的意思。 3、修

集群定時任務的重復執行

redis src 定時 img 可用 .com 設置 存在 服務器 開始的方案是提取定時任務,單獨部署. 或者根據ip機器號等判斷是否執行 然後在項目初期階段, 集群的目的是為了保證服務器7x24高可用性的冗余設計 所以上述兩種方案是有悖設計的 根據項目的實際情況, 本次

Linux定時任務cron簡介

have 自己 定時 file sch odi oot 運行 RoCE 1.1 特殊權限u+s /o+t [root@oldboyedu50-lnb ~]# ls -ld /bin/ls /usr/bin/passwd /tmp/ /usr/bin/locate

java定時任務

java中的定時任務, 使用java實現有3種方式: 1, 使用普通thread實現 @Test public void test1() { // 單位: 毫秒 final long timeInterval = 1000; Runnable

Linux系統定時任務cron和crontab命令詳解與配置規則說明

cron機制         cron可以讓系統在指定的時間,去執行某個指定的工作,我們可以使用crontab指令來管理cron機制 crontab引數         -u:這個引數可以讓我們去編輯其他人的crontab,如果沒有加上這個引數的話就會開啟自己的crontab

windows服務及asp.net定時任務管理

windows定時計劃任務管理系統quartz.net的使用 asp.net使用Hangfire開發後臺定時任務demo 使用C#製作Windows服務和安裝程式 quartz.net的真實使用 Quartz.net開源作業排程框架使用 Quartz.net持久化與叢

linux定時任務執行失敗

問題來源: 最近發現數據庫中有sleep程序無法關閉,並且阻塞時間過長,需要執行指令碼,定時清除 解決方案: 原指令碼檔案: #!/bin/sh MYSQLTOOL=mysql MYSQLUSER=root MYSQLPASS=**** HOST=

spring定時任務的cron表示式

在springboot可以使用自帶的定時任務或使用quartz進行定時任務,下來說以一下cron表示式的用法。 cron一共有7位,但是最後一位是年,可以留空,所以我們可以寫6位: * 第一位,表示秒,取值0-59 * 第二位,表示分,取值0-59 * 第三位,表示小時,取值0-23 * 第

springboot 定時任務cron表示式

一個cron表示式有至少6個(也可能7個)有空格分隔的時間元素。按順序依次為 秒(0~59) 分鐘(0~59) 小時(0~23) 天(月)(0~31,但是你需要考慮你月的天數) 月(0~11) 天(星期)(1~7 1=SUN 或 SUN,MON,TUE,WED,

Java定時任務3Jcrontab的使用

進階版初學Jcrontab感覺非常好,用它來做一個定時程式非常容易,而且方便。有關Jcrontab的介紹和它的定時檔案的格式,就不過多介紹了,這裡再來講解一下它在程式中的具體應用。在這裡,我們先約定資料來源這個概念,“資料來源”(我暫且這樣稱呼),它主要是用來由Jcrontab按照定時規則要處理的類和程式,這

Quartz定時任務SimpleTrigger任務、觸發器和排程器

1. RemaindJob package job; import org.quartz.Job; import org.quartz.JobExecutionContext; import o

Spring 3整合Quartz 2實現定時任務動態暫停 恢復 修改和刪除任務

前面我們已經完成了spring 3和quartz 2的整合以及動態新增定時任務,我們接著來完善它,使之能支援更多的操作,例如暫停、恢復、修改等。 在動態新增定時任務中其實已經涉及到了其中的一些程式碼,這裡我們再來細化的理一理。先來看一下我們初步要實現的目標效果圖,這裡

Java之路--js定時任務之輪詢

最近在專案裡做了非常簡單的審批流程,根據領導要求 需要定時檢查 登入使用者是否 有表單需要去審批 ,一開始以為用spring  task定時任務排程可能更易於實現,一上手發現,task定時後臺任務,比如清理快取,清理日誌等更為方便好用,而前臺頁面的定時任務,用js的定時器se

PHP在windows系統定時任務的實現

@echo off cls ::判斷Apache伺服器是否啟動 for /f "skip=3 tokens=4" %%i in ('sc query Apache) do set "zt=%%i" &goto :next :next if /i "%zt%"=="RUNNING" (goto 1

Spring定時任務

    需求:每天上午9點執行任務     使用Spring框架實現定時任務的編寫,這裡有兩種方法.      一、timer定時器 public class TestListen implements ServletContextListener { priva

記錄定時任務的一個錯誤crontab 使用"%"的問題

unless roo 記錄 翻譯 int 使用 tab 單獨 結束 最近工作需要,需要定時執行命令文件,並且把執行的日誌重定向輸出到以日期命名的文件中,命令如下: /bin/bash /data/shell/merge.sh &>> /data/shel

python的輕量級定時任務調度庫schedule

min nbsp 就會 threading 簡單 多線程 保持 一是 設置 提到定時任務調度的時候,相信很多人會想到celery,要麽就寫個腳本塞到crontab中。不過,一個小的定時腳本,要用celery的話太“重”了。所以,我找到了一個輕量級的定時任務調度的庫:sche

linux基礎篇(十)基於Redhat7系統定時任務

定時任務CRONTAB概念/介紹 crontab命令用於設定週期性被執行的指令。該命令從標準輸入裝置讀取指令,並將其存放於“crontab”檔案中,以供之後讀取和執行。 cron 系統排程程序。 可以使用它在每天的非高峰負荷時間段執行作業,或在一週或一月中的不同時段執行。cron是系統主

python的輕量級定時任務排程庫schedule

提到定時任務排程的時候,相信很多人會想到芹菜celery,要麼就寫個指令碼塞到crontab中。不過,一個小的定時指令碼,要用celery的話太“重”了。所以,我找到了一個輕量級的定時任務排程的庫:schedule。 庫的安裝還是最簡單的pip install sche