
概述
一些需要root权限又需要开机自动启动的程序,以LaunchDaemons加载是一个很好的选择,本文以foo 为例简述其全过程。注:本机用户名roca,程序名为foo,你可以将这两个地方替换成你自己需要的,其他依葫芦画瓢即可。
前期准备
sudo mkdir -p /usr/local/foo
将下载好的 foo 放入 /usr/local/foo
创建启动脚本
-
sudo nano /usr/local/foo/run.shbash#!/bin/bash set -euo pipefail export PATH="/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin" cd /usr/local/foo exec /usr/local/foo/foo_darwin_arm64_2.2.7.4 \ --foo-bin /usr/local/foo/foo \ --config /usr/local/foo \ --foo-assetsdir /usr/local/foo
创建守护进程配置文件
-
nano /Library/LaunchDaemons/com.roca.foo.plistbash<?xml version="1.0" encoding="UTF-8"?> <!DOCTYPE plist PUBLIC "-//Apple//DTD PLIST 1.0//EN" "http://www.apple.com/DTDs/PropertyList-1.0.$ <plist version="1.0"> <dict> <key>Label</key> <string>com.roca.foo</string> <key>ProgramArguments</key> <array> <string>/bin/bash</string> <string>/usr/local/foo/run.sh</string> </array> <key>RunAtLoad</key> <true/> <key>KeepAlive</key> <true/> <!-- 日志 --> <key>StandardOutPath</key> <string>/var/log/foo.out</string> <key>StandardErrorPath</key> <string>/var/log/foo.err</string> </dict> </plist>
权限调整
-
输入以下指令
bashsudo chown root:wheel /Library/LaunchDaemons/com.roca.foo.plist sudo chmod 644 /Library/LaunchDaemons/com.roca.foo.plist sudo chmod -R 755 /usr/local/foo sudo chown -R root:wheel /usr/local/foo上述准备操作完成后,即可利用 launchctl 指令对 plist 文件进行操作了(类似于在 Linux 下的 systemctl 之于 /etc/systemd/system/*.service)
-
Enable (开机自启)
sudo launchctl bootstrap system /Library/LaunchDaemons/com.roca.foo.plist -
Disable (取消开机自启)
将对应的 LaunchDaemon plist 文件移出 /Library/LaunchDaemons 目录。
注:macOS 的 launchd 不存在类似 Linux 下 systemctl disable 那样的状态位,自启与否仅由 plist 是否存在于 /Library/LaunchDaemons 决定。
-
Stop
sudo launchctl bootout system /Library/LaunchDaemons/com.roca.foo.plist -
Restart
sudo launchctl kickstart -k system/com.roca.foo -
State
sudo launchctl print system/com.roca.foo看日志
tail -n 100 /var/log/foo.err
tail -n 100 /var/log/foo.out查进程
ps -A|grep foo清quarantine标记
sudo xattr -dr com.apple.quarantine /usr/local/foo

新版本macos,有时候会弹出程序无法检测到是否恶意软件这个弹窗,输入以上命令可以解决问题。或打开系统设置 → 隐私与安全性 拉到最下,然后选 "仍要打开" 也可以
-
检查PLIST语法是否合规
plutil -lint /Library/LaunchDaemons/com.roca.foo.plist