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 | "1.0" encoding="UTF-8" xml version= |
对于上面plist文件部分键值说明:
Label (必须)
该项服务的名称,且文件名必须和Label一致,比如上述的plist文件,文件名就叫com.example.exampled.plist
ProgramArguments
指定可执行文件路径及其参数,比如执行ls -a
,对应到该配置中,应该写作:
1 | <key>ProgramArguments</key> |
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 | # 加载启动任务 |
停止服务
1 | sudo launchctl stop <path> |
开始服务
1 | sudo launchctl start <path> |
kill服务
1 | sudo launchctl kill <path> |
卸载任务
1 | # 停止并卸载任务。下次登录/重新启动时,任务仍将重新启动。 |
查看服务运行状态
1 | launchctl list |
输出具有以下含义:
第一个数字是进程的PID,如果它正在运行,如果它不运行,它显示一个’ - ‘。
第二个数字是进程的退出代码(如果它已经完成)。如果是负数,则是杀死信号的数量。
第三列是进程名称。
下面这个就说明开机启动nginx服务已经成功了
注意:执行launchctl
命令加sudo
与不加结果是完全不同的。
2. 先用nginx举个🌰
如果你是用homebrew
安装的nginx
,访问/usr/local/opt/nginx
,会发现该目录下有一个文件homebrew.mxcl.nginx.plist
,这个就是开机自启动的配置文件,我们只需要把它复制到/Library/LaunchDaemons
目录下即可
然后启动它就好了
3. 拓展
这里我想到了一个问题,就是在mac上我遇到过一些软件会莫名其妙开机自启动,但是在软件的设置地方又找不到取消开机自启动的选项,这样的话我们可以尝试删除这里的plist文件(这只是我的一个设想,还没有实践过😂,逃23333)