【笔记】MacOS计划任务

前言

MacOS除了可以使用Linux的crontab方式执行计划任务,还可以使用launchctl执行计划任务,也就是MacOS中的服务(Service)

创建计划任务执行的脚本

  • 创建一个脚本文件
1
touch run.sh
  • 编辑脚本
1
vim run.sh
  • 将脚本权限改为可执行权限
1
chmod +x run.sh

创建计划任务配置文件

  • ~/Library/LaunchAgents目录下创建以.plist为后缀的文件

其他目录,守护进程任务项会在开机后进入登录界面就立即执行,任务项只有在成功登录后才会执行

~/Library/LaunchAgents:用户计划任务项
/Library/LaunchAgents:管理员计划任务项
/Library/LaunchDaemons:管理员守护进程任务项
/System/Library/LaunchAgents:系统级计划任务项
/System/Library/LaunchDaemons:系统级守护进程任务项

1
2
cd ~/Library/LaunchAgents
touch com.demo.plist

配置文件编写示例

Label:定义主键
ProgramArguments:指定命令

<array></array>:指定该命令的的多个参数,每个<string></string>中定义一个参数

RunAtLoad:在系统启动时执行(时间参数只能出现一次)
StartInterval:指定间隔时间(单位:秒)(时间参数只能出现一次)
StartCalendarInterval:指定启动时间(时间参数只能出现一次)

dict:单个时间点
array:多个时间点

Minute:定义分钟
Hour:定义小时
Day:定义天
Weekday:定义星期(0和7都表示星期日)
Month:定义月份

WorkingDirectory:工作目录
StandardOutPath:日志输出位置(可以省略)
StandardErrorPath:报错日志输出位置(可以省略)

开机自启

com.demo.plist
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
<?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.demo.plist</string>
<key>ProgramArguments</key>
<array>
<string>say</string>
<string>hello</string>
</array>
<key>RunAtLoad</key>
<true/>
<key>WorkingDirectory</key>
<string>~</string>
<key>StandardOutPath</key>
<string>~/run.log</string>
<key>StandardErrorPath</key>
<string>~/run.err</string>
</dict>
</plist>

指定时间自启

com.demo.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
<?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.demo.plist</string>
<key>ProgramArguments</key>
<array>
<string>say</string>
<string>hello</string>
</array>
<key>StartCalendarInterval</key>
<dict>
<key>Minute</key>
<integer>10</integer>
<key>Hour</key>
<integer>09</integer>
</dict>
<key>StandardOutPath</key>
<string>~/run.log</string>
<key>StandardErrorPath</key>
<string>~/run.err</string>
</dict>
</plist>

指定时间间隔自启

com.demo.plist
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
<?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.demo.plist</string>
<key>ProgramArguments</key>
<array>
<string>say</string>
<string>hello</string>
</array>
<key>StartInterval</key>
<dict>
<key>Day</key>
<integer>1</integer>
</dict>
<key>StandardOutPath</key>
<string>~/run.log</string>
<key>StandardErrorPath</key>
<string>~/run.err</string>
</dict>
</plist>

计划任务的操作(旧版MacOS)

查看所有计划任务

1
launchctl list

查看指定计划任务

1
launchctl list | grep "com.demo.plist"

加载/卸载计划任务

com.demo.plist.plist结尾的计划任务配置文件

加载计划任务

1
sudo launchctl load com.demo.plist

卸载计划任务

1
sudo launchctl unload com.demo.plist

开始/结束计划任务

  • 立即执行计划任务

开始计划任务

1
launchctl start com.demo.plist

结束计划任务

1
launchctl stop com.demo.plist

计划任务的操作(新版MacOS)

查看指定计划任务

1
launchctl list | grep "com.demo.plist"

加载/卸载计划任务

service-target

  • service-targetdomain-target/service-name组成
1
2
3
4
5
6
7
8
9
10
11
12
13
14
system/[service-name]
Targets the system-wide domain or service within. Root privileges are required to make modifications.

user/<uid>/[service-name]
Targets the user domain or service within. A process running as the target user may make modifications. Root may modify any user's domain. User domains do not exist on iOS.

gui/<uid>/[service-name]
Targets the GUI domain or service within. Each GUI domain is associated with a user domain, and a process running as the owner of that user domain may make modifications. Root may modify any GUI domain. GUI domains do not exist on iOS.

session/<asid>/[service-name]
Targets a session domain or service within. A process running within the target security audit session may make modifications. Root may modify any session domain.

pid/<pid>/[service-name]
Targets a process domain or service within. Only the process which owns the domain may modify it. Even root may not do so.

针对于非守护进程任务的

加载计划任务
1
launchctl enable <service-target>
  • 举例

gui/501/com.demo.plist:service-target

gui/501:domain-target,表示在GUI域中的第一个用户
com.demo.plist:service-name

1
launchctl enable gui/501/com.demo.plist
卸载计划任务
1
launchctl disable <service-target>

针对于守护进程任务的

加载计划任务

<service-path_1><service-path_2>:任务配置文件的所在目录

1
launchctl bootstrap <domain-target> <service-path_1> <service-path_2>
1
launchctl bootstrap <service-target>
卸载计划任务
1
launchctl bootout <domain-target> <service-path_1> <service-path_2>
1
launchctl bootout <service-target>

完成

参考文献

间书——繁著
间书——walkerwzy