年轻人的第一个 macOS 服务项(plist)

笑死,世纪难题(

我用 macOS 也有一段时间了,而在这上面的体验,终有些不足。因为 macOS 的开发者「并不算」很多,以至于一些「特殊需求」的软件没几个能玩的。而对于我来说,又不喜欢妥协,因此就一直在寻求使用类似于 Linux 的 systemd 这类管理程序来实现一些软件的开机自启。

而当我无意间看到 macOS 有 launchd 这种管理程序的时候,我就知道,属于我们的时代来临力 ,我的想法可以实现了

准备

先普及一个知识

plist 在 macOS 上一共存在于五个文件夹中,而 Apple 给出了他们的用途

文件夹 用途
/系统/资源库/LaunchDaemons Apple 提供的系统守护进程
/系统/资源库/LaunchAgents Apple 提供的基于每个用户且所有用户适用的代理
/资源库/LaunchDaemons 第三方系统守护进程
/资源库/LaunchAgents 基于每个用户且所有用户适用的第三方代理
~/资源库/LaunchAgents 仅适用于登录用户的第三方代理

无特殊需求的话,只需要放在最后一个文件夹里就可以,同时以 User 权限运行,可以避免一些由于权限配置错误导致的问题

基本语法为

1
2
3
4
5
6
7
8
9
10
11
12
<?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 的核心为例,因为某些特殊需要,需要常驻后台来运行以及开机自启

因此就可以这么实现

1
nano ~/Library/LaunchAgents/verysimple.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>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 查看绝对路径

然后加载这个配置文件,并启动

1
2
launchctl load ~/Library/LaunchAgents/verysimple.plist
launchctl start verysimple

然后测试,能够正常运行就代表配置成功了

取消加载、删除

如果不需要这个配置文件了,可以通过这种方式来取消加载,最后一步为删除该配置文件

1
2
3
launchctl stop verysimple
launchctl unload ~/Library/LaunchAgents/verysimple.plist
rm ~/Library/LaunchAgents/verysimple.plist

参考

  1. Mac - 服务管理 launchd、launchctl、LaunchAgent、LaunchDaemon、brew services详解 | Bruce’s Blog

  2. Mac OS Launchd 启动服务详解_卢凯文的博客-CSDN博客_launchd

  3. Mac下使用launchctl创建定时任务 - 简书

  4. Mac使用Launchd命令行lauchctl操作服务的简单用法 - EasonJim - 博客园

  5. 在 Mac 上的“终端”中使用 launchd 管理脚本 - 官方 Apple 支持 (中国)