前言 MacOS除了可以使用Linux的crontab方式执行计划任务,还可以使用launchctl执行计划任务,也就是MacOS中的服务(Service)
创建计划任务执行的脚本
创建计划任务配置文件
在~/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 | 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-target
由domain-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