macos设置开机启动任务

macos设置开机启动任务

方法1——系统偏好设置

进入系统偏好设置->帐户->登陆项

这个就先不讲了,体验感有点差

方法2——launchctl

launchctl是一个统一的服务管理框架,启动、停止和管理守护进程、应用程序、进程和脚本。下面讲述一下如何在Mac上使用launchctl执行定时任务。

1. 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定义的守护进程任务项

plist文件示例:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE plist PUBLIC -//Apple Computer//DTD PLIST 1.0//EN
http://www.apple.com/DTDs/PropertyList-1.0.dtd >
<plist version="1.0">
<dict>
<key>Label</key>
<string>com.example.exampled</string>
<key>ProgramArguments</key>
<array>
<string>exampled</string>
</array>
<key>KeepAlive</key>
<true/>
<key>RunAtLoad</key>
<true/>
</dict>
</plist>

对于上面plist文件部分键值说明:

Label (必须)

该项服务的名称,且文件名必须和Label一致,比如上述的plist文件,文件名就叫com.example.exampled.plist

ProgramArguments

指定可执行文件路径及其参数,比如执行ls -a,对应到该配置中,应该写作:

1
2
3
4
5
<key>ProgramArguments</key>
<array>
<string>ls</string>
<string>-a</string>
</array>

RunAtLoad (可选)

标识launchd在加载完该项服务之后立即启动路径指定的可执行文件。默认值为 false,设置为 true 即可实现开机运行脚本文件。

StartCalendarInterval (可选)

该关键字可以用来设置定时执行可执行程序,可使用 Month, Day, Hour, Minute, Second等子关键字,它可以指定脚本在多少月,天,小时,分钟,秒,星期几等时间上执行,若缺少某个关键字则表示任意该时间点,类似于 Unix 的 Crontab 计划任务的设置方式,比如在该例子中设置为每小时的20分的时候执行该命令。

KeepAlive(可选)

是否保持持续运行

所有key关键字详细使用说明可以在Mac OS X终端下使用命令man launchd.plist查询

更多请参考:https://www.manpagez.com/man/5/launchd.plist/

launchctl的一些常用的命令

检测plist文件语法是否有错误

1
plutil local.localhost.startup.plist

注:以下服务如果需要用sudo才能启动的,需要在命令前加入sudo

载入配置, 使配置生效

1
2
3
4
5
# 加载启动任务
launchctl load ~/Library/LaunchAgents/example.plist

# 加载任务, -w选项会在下次登录/重新启动时重新启动。
launchctl load -w ~/Library/LaunchAgents/example.plist

停止服务

1
sudo launchctl stop <path>

开始服务

1
sudo launchctl start <path>

kill服务

1
sudo launchctl kill <path>

卸载任务

1
2
3
4
5
# 停止并卸载任务。下次登录/重新启动时,任务仍将重新启动。
launchctl unload ~/Library/LaunchAgents/example.plist

# 该任务将不会在下次登录/重新启动时重新启动。
launchctl unload -w ~/Library/LaunchAgents/example.plist

查看服务运行状态

1
2
launchctl list
sudo launchctl list(有时候一些需要用sudo才能执行的服务就需要用sudo才能查看)

输出具有以下含义:

第一个数字是进程的PID,如果它正在运行,如果它不运行,它显示一个’ - ‘。
第二个数字是进程的退出代码(如果它已经完成)。如果是负数,则是杀死信号的数量。
第三列是进程名称。

下面这个就说明开机启动nginx服务已经成功了

注意:执行launchctl命令加sudo与不加结果是完全不同的。

image-20200520134953097

2. 先用nginx举个🌰

如果你是用homebrew安装的nginx,访问/usr/local/opt/nginx,会发现该目录下有一个文件homebrew.mxcl.nginx.plist,这个就是开机自启动的配置文件,我们只需要把它复制到/Library/LaunchDaemons目录下即可

然后启动它就好了

3. 拓展

这里我想到了一个问题,就是在mac上我遇到过一些软件会莫名其妙开机自启动,但是在软件的设置地方又找不到取消开机自启动的选项,这样的话我们可以尝试删除这里的plist文件(这只是我的一个设想,还没有实践过😂,逃23333)

Reference

本文标题:macos设置开机启动任务

文章作者:xianyu123

发布时间:2020年05月20日 - 09:57

最后更新:2020年08月24日 - 10:42

原始链接:http://0clickjacking0.github.io/2020/05/20/macos设置开机启动任务/

许可协议: 署名-非商业性使用-禁止演绎 4.0 国际 转载请保留原文链接及作者。

-------------    本文结束  感谢您的阅读    -------------