Mac上,執行定時任務:launchctl

在Mac上定時執行任務


在Mac上,執行定時任務,有兩種方式:html

  1. 使用launchctl
  2. 沿襲Linux經常使用的crontab命令

畢竟咱是在mac上開發,這裏只講launchctl的用法python


1.首先須要編寫plist文件

下圖是個人一個很簡單的任務plist文件:linux

輸入圖片說明

可使用plutil -lint來驗證plist的格式是否正確(這只是表明plist格式正確,不表明裏面的命令是有效的)git

plist文件裏具體的key能夠參考:github

  1. 蘋果官方文檔:The Mac OS X launchd plist format | launchd plist file format (valid keys) | alvinalexander.com
  2. Mac下添加定時任務 - 劉國濤的專欄 - 博客頻道 - CSDN.NET

2.定時腳本

上圖使用的定時腳本爲test.sh,如下爲文件內容:macos

#!/bin/sh
say hello world

上面的腳本會讓電腦發聲「hello world」,記得打開電腦音量~windows

注意:bash

你須要將test.sh置爲可執行文件,可用命令:chmod a+x test.sh
不然的話,腳本就根本不可能執行的。網上不少文章都沒強調這一點網絡

你也可使用ls -l看看test.sh是否可執行(擁有x權限),以下圖:app

輸入圖片說明


3. plist文件放置處:

  • ~/Library/LaunchAgents 由用戶本身定義的任務項
  • /Library/LaunchAgents 由管理員爲用戶定義的任務項
  • /Library/LaunchDaemons 由管理員定義的守護進程任務項
  • /System/Library/LaunchAgents 由Mac OS X爲用戶定義的任務項
  • /System/Library/LaunchDaemons 由Mac OS X定義的守護進程任務項

建議放在 ~/Library/LaunchAgents 下面。

下面再來理解幾個基礎概念:

/System/Library和/Library和~/Library目錄的區別?

/System/Library目錄是存放Apple本身開發的軟件。
/Library目錄是系統管理員存放的第三方軟件。
~/Library/是用戶本身存放的第三方軟件。

LaunchDaemons和LaunchAgents的區別?

LaunchDaemons是用戶未登錄前就啓動的服務(守護進程)。
LaunchAgents是用戶登錄後啓動的服務(守護進程)。

參考自:
Mac launchctl StartInterval not working | launchctl launchd StartInterval, ThrottleInterval | alvinalexander.com


4.加載命令

最常使用的命令:

  1. 加載任務 launchctl load -w ***.plist-w選項會將plist文件中無效的key覆蓋掉,建議加上
  2. 刪除任務 launchctl unload -w ***.plist
  3. 查看任務列表 launchctl list;列表會顯示不少任務,建議過濾一下:launchctl list | grep '任務的部分名字'

launchctl命令能夠參考:蘋果官方文檔:launchctl(1) Mac OS X Manual Page


5.題外話

我在用 launchctl 或者 crontab 遇到一樣的問題:

好比個人 launchctl 裏面加載了腳本test.sh

test.sh 腳本的內容:

#!/bin/bash

svn status | xargs echo 
echo "out: 輸出正確的中文"

在使用在launchctl 定時執行test.sh腳本的輸出:
svn st | xargs echo: 這行輸出若是有中文,中文部分亂碼;
echo "out: 輸出正確的中文": 這行會輸出正確的中文

這裏面就是編碼的問題,以後我參考了下面的文章:

crontab,svn郵件,日誌亂碼解決方法(LINUX) :

前段時間一直爲linux下的SVN郵件通知亂碼而發愁,苦苦尋找了2個星期最終發現本身果真很白。。不知道是問題太簡單了仍是別的緣由,,一直沒有在網上找到解決的相關方法和資料(大部分都是windows下的配置,但是額D是linux哇)。下面是解決方法,但願對和我同樣鬱悶的人有幫助

以前有人說修改/etc/profile 加入環境量變,這個只能修改郵件自己的亂碼問題,不能修正log diff中的亂碼,亂碼的緣由是在svn調用post-commit的時候沒有定義變量形成的,svn和crontab是無視系統默認變量的(=。=!!)。須要在post-commit中加入

#!/bin/sh

LANG=en_US.UTF-8

export LANG

以後svn或者crontab在調用的時候就能夠正常輸出中文了 編碼能夠按本身的狀況進行修改~

按照裏面的說明,將test.h腳本文件修改以下:

#!/bin/bash

LANG=en_US.UTF-8
export LANG

svn status | xargs echo 
echo "out: 輸出正確的中文"

設置了編碼以後,全部的輸出立馬就正常了。


6.參考:

感興趣的,想深刻研究的,建議看看文章

蘋果官方文檔:

alvinalexander.com上的文章:

其餘:

相關文章
相關標籤/搜索