本文以macOS上通过launchctl命令开机自动启动homebrew安装的wireguard服务来说明部分launchctl使用用法。
首先,需要写一个launch文件,后缀为.plist,格式为很神奇的xml格式,因为wireguard会修改整个的网络设置,所以需要该配置文件放在/Library/LaunchDaemons/文件夹下,在其下创建com.wireguard.wg0.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.wireguard.wg0</string>
<key>ProgramArguments</key>
<array>
<!-- Points to local version of wg-quick that
fixes path issues with the script -->
<string>/opt/homebrew/bin/wg-quick</string>
<string>up</string>
<string>wg0</string>
</array>
<key>KeepAlive</key>
<dict>
<key>NetworkState</key>
<true/>
</dict>
<key>RunAtLoad</key>
<true/>
<key>StandardErrorPath</key>
<string>/opt/homebrew/var/log/wireguard.err</string>
<key>EnvironmentVariables</key>
<dict>
<key>PATH</key>
<!-- Adds in user-specific and Homebrew bin directories to start of PATH -->
<string>/Users/jackguan/.local/bin:/opt/homebrew/bin:/usr/local/sbin:/usr/local/bin:/usr/bin:/bin:/usr/sbin:/sbin</string>
</dict>
</dict>
</plist>
在Label中输入服务的名称,也就是com.wireguard.wg0,注意:文件名要与这个Label标签的值保持一致。然后在Array下添加命令每个位置的值,因为wg启动wg0的命令为
wg-quick up wg0
所以Array中有仨,第一个填wg-quick的二进制文件地址,第二个为up,第三个wg0。
在保存完成后输入
sudo launchctl enable system/com.wireguard.wg0
sudo launchctl bootstrap system /Library/LaunchDaemons/com.wireguard.wg0.plist
设置开机启动服务。
另外通过
launchctl list | grep -v "appple"
可以筛选出非apple的开机启动项,选择不想要的干掉,比如我这里有
- 0 com.adobe.AdobeCreativeC
- 0 com.apphousekitchen.aldente-pro-LaunchAtLoginHelper
这俩开机自启,而且还无法设置关闭。通过
launchctl stop com.apphousekitchen.aldente-pro-LaunchAtLoginHelper
即可停止开机自动开启脚本