笑死,世纪难题(
我用 macOS 也有一段时间了,而在这上面的体验,终有些不足。因为 macOS 的开发者「并不算」很多,以至于一些「特殊需求」的软件没几个能玩的。而对于我来说,又不喜欢妥协,因此就一直在寻求使用类似于 Linux 的 systemd 这类管理程序来实现一些软件的开机自启。
而当我无意间看到 macOS 有 launchd 这种管理程序的时候,我就知道,属于我们的时代来临力 ,我的想法可以实现了
准备
先普及一个知识
plist 在 macOS 上一共存在于五个文件夹中,而 Apple 给出了他们的用途
| 文件夹 | 用途 |
|---|---|
| /系统/资源库/LaunchDaemons | Apple 提供的系统守护进程 |
| /系统/资源库/LaunchAgents | Apple 提供的基于每个用户且所有用户适用的代理 |
| /资源库/LaunchDaemons | 第三方系统守护进程 |
| /资源库/LaunchAgents | 基于每个用户且所有用户适用的第三方代理 |
| ~/资源库/LaunchAgents | 仅适用于登录用户的第三方代理 |
无特殊需求的话,只需要放在最后一个文件夹里就可以,同时以 User 权限运行,可以避免一些由于权限配置错误导致的问题
基本语法为
<?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>进程名</string>
<key>ProgramArguments</key>
<array>
<string>运行参数</string>
</array>
</dict>
</plist>
这样便构成了一个基本的使用方法
一个例子
因为在 Mac 上并没有如同 Windows 一样有各种软件的客户端,一些软件可能在 Mac 上只有 Core 你说连 Core 都没有?那换个玩吧
所以我便以一个 vs 的核心为例,因为某些特殊需要,需要常驻后台来运行以及开机自启
因此就可以这么实现
nano ~/Library/LaunchAgents/verysimple.plist
然后填入如下内容
<?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>verysimple</string>
<key>RunAtLoad</key>
<true/>
<key>KeepAlive</key>
<true/>
<key>ProcessType</key>
<string>Background</string>
<key>ProgramArguments</key>
<array>
<string>./verysimple</string>
<string>-c</string>
<string>client.toml</string>
</array>
<key>WorkingDirectory</key>
<string>/Users/leaoduan/vs</string>
</dict>
</plist>
其中,第 17 行 的 client.toml 是配置文件,第 20 行的是运行目录。
需要注意,所有包含路径的部分需要是绝对目录,可以在终端里打 pwd 查看绝对路径
然后加载这个配置文件,并启动
launchctl load ~/Library/LaunchAgents/verysimple.plist
launchctl start verysimple
然后测试,能够正常运行就代表配置成功了
取消加载、删除
如果不需要这个配置文件了,可以通过这种方式来取消加载,最后一步为删除该配置文件
launchctl stop verysimple
launchctl unload ~/Library/LaunchAgents/verysimple.plist
rm ~/Library/LaunchAgents/verysimple.plist