文章参考了A Launchd Tutorial网页存档),其中较为系统地讲述了macOS应用开机启动的配置方式。

文章参考了Apple Developer的一个页面网页存档),其中对于launchd的设计与使用要求作了讲解。

文章参考了AList官方文档网页存档),其中给出了Linux守护进程的实现细节。

个人配置

  • 操作系统:macOS Ventura 13.1
  • AList版本:v3.2.1

编写并保存plist文件

打开惯用的文本编辑器(如“TextEdit.app”),粘贴如下内容:

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>KeepAlive</key>
<dict>
<key>NetworkState</key>
<true/>
</dict>
<key>Label</key>
<string>local.alist.launch</string>
<key>ProgramArguments</key>
<array>
<string>/path/to/alist</string>
<string>server</string>
</array>
<key>RunAtLoad</key>
<true/>
<key>StandardErrorPath</key>
<string>/path/to/alist.output.log</string>
<key>WorkingDirectory</key>
<string>/path/to/alist/directory</string>
</dict>
</plist>

其中:

  • Label键所对应的值local.alist.launch是plist的文件名,可以根据自己的喜好选取可读性高的英文名称。
  • /path/to/alist是AList二进制程序的绝对路径。如:/User/john/alist
  • /path/to/alist.output.log是AList启动时输出的内容,存放在了名为alist.output.log的文件中,可以自行设置存放位置。请使用绝对路径。如:/User/john/alist
  • /path/to/alist/directory是存放AList二进制程序的目录的绝对路径,即比第一个/path/to/alist少了最后的“alist”。

之后,保存文件,将文件名按照上述Label键的值填写,此处使用local.alist.launch.plist。将保存的文件拷贝至~/Library/LaunchAgents

利用plist文件设置开机启动

在终端中输入launchctl load -w (注意末尾有空格),再将刚刚拷贝到LaunchAgents目录下的plist文件拖拽到终端内释放(即输入文件路径),之后按下return键。plist文件会立即加载,并从下次登录起自动加载(即登录启动)。

  • 如果没有输出,则在终端中输入ps -ef | grep alist,应当能够看到/path/to/alist server项。此即配置成功,可以打开浏览器访问验证。(当然,前提是你之前没有手动打开AList)
  • 如果加载时遇到报错,或者没有在ps -ef | grep alist后看到预期的输出,则是plist文件编写存在问题。可先使用plutil -lint /path/to/plist/file检查语法错误,再进一步排查。
    • 如果修改了有问题的plist后,需要重新加载,则可以先在终端中输入launchctl unload -w /path/to/plist/file
      解除加载,之后再使用前面的launchctl load -w加载。

参数说明

  • KeepAliveNetworkStatetrue(必需):在网络连接后启动,这与官方文档中的守护进程写法类似。
  • Labellocal.alist.launch(必需):plist的项目名字是local.alist.launch,可以自行修改。
  • ProgramArguments/path/to/alist, server(必需):第一个位置是二进制程序绝对路径,第二个及之后的位置为顺序的参数。
  • RunAtLoadtrue(必需):加载即启动。加载和启动是两部分,不打开此项,则仅加载不启动。
  • StandardErrorPath/path/to/alist.output.log(可选):将运行时的输出转存至/path/to/alist.output.log(绝对路径),可以自行修改(包括文件名)。便于debug,跟踪运行情况。
  • WorkingDirectory/path/to/alist/directory(必需):设置AList的工作目录为/path/to/alist/directory,即存放AList二进制程序的目录的绝对路径(非常重要)。**如果不设置,则默认是系统根目录/**,在较新版本的系统中是只读的,无法生成AList运行所需配置文件;或者如果是可写的,则AList会在那里自动重新写配置文件,这同样不是预期的行为。

注意事项

上文中给出的方式是针对当前用户设置用户级启动项,能够满足大多数个人用户。所有操作是在当前用户有权限的目录下进行的,因此请勿使用sudo执行。使用sudo执行会导致系统因所有者权限问题而提出警告(warning)。

系统级启动项的plist一般放在系统级路径下(如/Library/LaunchDaemons/Library/LaunchAgents等),且所需启动的plist所有者需要是root,所以对于使用了sudo设置用户级启动项的情况,有些“教程”可能才给出了使用chown的解决方案。这样将用户文件夹内的启动项设置为系统级启动项、并更改所有者为root的做法是不推荐的。