Mac 定时任务 launchctl

Mac-定时任务-launchctl

Posted by cl9000 on April 09, 2017

Mac 定时任务 launchctl

launchctl

launchctl: 是一个统一的服务管理框架,可以启动、停止和管理守护进程、应用程序、进程和脚本等。
launchctl是通过配置文件来指定执行周期和任务的。

配置文件(plist文件)

launchctl 将根据plist文件的信息来启动任务。

plist文件位置:
  • ~/Library/LaunchAgents 由用户自己定义的任务项(推荐)
  • /Library/LaunchAgents 由管理员为用户定义的任务项
  • /Library/LaunchDaemons 由管理员定义的守护进程任务项
  • /System/Library/LaunchAgents 由Mac OS X为用户定义的任务项
  • /System/Library/LaunchDaemons 由Mac OS X定义的守护进程任务项
plist部分参数说明:
  • Label:全局唯一性;
  • ProgramArguments:指定要运行的脚本
  • StartCalendarInterval:可以指定脚本在多少分钟、小时、天、星期几、月时间上执行
  • StartInterval:指定脚本每间隔多长时间(单位:秒)执行一次;
  • StandardInPath、StandardOutPath、StandardErrorPath:标准的输入、输出、错误文件。

相关命令

1
2
3
4
5
6
7
8
9
10
11
12
13
14
# 加载任务, -w选项会将plist文件中无效的key覆盖掉,建议加上
$ launchctl load -w com.test.plist

# 删除任务
$ launchctl unload -w com.test.plist

# 查看任务列表, 使用 grep '任务部分名字' 过滤
$ launchctl list | grep 'test.demo'

# 开始任务 - 立即执行
$ launchctl start com.test.plist

# 结束任务
$ launchctl stop com.test.plist

使用

  1. 新建

    1
    2
    3
    demo
    - com.test.plist
    - testshell.sh
  2. 内容:
    com.test.plist

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
<?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.test</string>

<!-- 要运行的程序, 如果省略这个选项,会把ProgramArguments的第一个
元素作为要运行的程序 -->
<key>Program</key>
<string>/Users/weichanglu/Desktop/demo/testShell.sh</string>

<!-- 指定要运行的脚本 -->
<key>ProgramArguments</key>
<array>
<string>/Users/weichanglu/Desktop/demo/testShell.sh</string>
</array>

<!-- 指定运行的时间 -->
<key>StartCalendarInterval</key>
<dict>
<key>Minute</key>
<integer>30</integer>

<key>Hour</key>
<integer>9</integer>

<key>Day</key>
<integer>1</integer>

<key>Month</key>
<integer>5</integer>

<!-- 0和7都指星期天 -->
<key>Weekday</key>
<integer>0</integer>
</dict>

<!-- 运行间隔,与StartCalenderInterval使用其一,单位为秒 -->
<key>StartInterval</key>
<integer>3</integer>

<!-- 标准输入文件 -->
<key>StandardInPath</key>
<string>/Users/uniflor/runin.log</string>

<!-- 标准输出文件 -->
<key>StandardOutPath</key>
<string>/Users/weichanglu/Desktop/demo/success.log</string>

<!-- 标准错误输出文件,错误日志 -->
<key>StandardErrorPath</key>
<string>/Users/weichanglu/Desktop/demo/error.log</string>
</dict>
</plist>

testshell.sh

1
2
3
4
5
#!/bin/bash
#记录时间 - 自定义脚本或Python脚本
echo `date` >> ~/Desktop/demo/success.log
time=$(date "+%Y-%m-%d %H:%M:%S")
echo "$time" >> ~/Desktop/demo/time.txt
  1. 将 plist 文件复制到 ~/Library/LaunchAgents 目录下,需要权限。

  2. 终端执行 $ cd ~/Library/LaunchAgents,目录下,执行启动服务命令,参考上面命令。

  3. 查看输出文件。

路径基础概念

/System/Library和/Library和~/Library目录的区别?

/System/Library目录是存放Apple自己开发的软件。
/Library目录是系统管理员存放的第三方软件。
~/Library/是用户自己存放的第三方软件。

LaunchDaemons和LaunchAgents的区别?

LaunchDaemons是用户未登陆前就启动的服务(守护进程)。
LaunchAgents是用户登陆后启动的服务(守护进程)。

补充

  1. 运行异常:... operation not permitted ...
    解决方案:暂时关闭Mac rootless机制
  2. 权限问题
    注意,脚本要改成可执行的权限:
    chmod 777 *.sh

launchctl的GUI工具

LaunchControl,用这个工具可以查看到所有的launchctl定时任务。并用GUI的方式进行修改执行等。

参考

OS X 添加定时任务



支付宝打赏 微信打赏

赞赏一下 坚持原创技术分享,您的支持将鼓励我继续创作!