macos 下使用launchctl和plist启动进程

macOS 下可以用 launchctlplist 手动启动应用进程,或者让程序随系统启动。它有好几个域(domain)来将服务进行分类,并管理不同的权限。最常用的是System和GUI,下面是使用的一些规则:

system 域

有需要使用 root 权限的,可以使用 System 域来启动,但是 plist 必须放在:/Library/LaunchDaemons/ 下面。(/System/Library/LaunchDaemons/ 下是系统自带的一些服务,用户不用考虑这个路径)

plist 文件的权限也需要调整,用户和组是 root:wheel,权限是 644 (-rw-r--r--)。

加载和卸载的命令是:

sudo launchctl bootstrap system /Library/LaunchDaemons/com.xxx.plist
sudo launchctl bootout system /Library/LaunchDaemons/com.xxx.plist

gui 域

普通应用直接使用 gui 域就可以了。对应的plist文件需要放在:~/Library/LaunchAgents/(当前用户)或 /Library/LaunchAgents/(所有用户)下面。

加载和卸载命令是:

launchctl bootstrap gui/uid ~/Library/LaunchAgents/com.xxx.plist
launchctl bootout gui/uid ~/Library/LaunchAgents/com.xxx.plist

命令中的 uid 可以通过 id 命令获取:

id -u username

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>com.xxx.xxx</string>
<key>ProgramArguments</key>
<array>
<string>/usr/local/bin/filename</string>
<string>-argument</string>
<string>/path/to/if/necessary</string>
</array>
<key>RunAtLoad</key>
<true/>

<key>KeepAlive</key>
<false/>
</dict>
</plist>

其他功能

launchctl 还有其他的命令,比如 enabledisablekickstart 等,有需要可以通过 man launchctl 去详细了解。