【技巧】MacOS下使用LaunchDaemons实现开机自启动

概述

一些需要root权限又需要开机自动启动的程序,以LaunchDaemons加载是一个很好的选择,本文以foo 为例简述其全过程。注:本机用户名roca,程序名为foo,你可以将这两个地方替换成你自己需要的,其他依葫芦画瓢即可。

前期准备
  • sudo mkdir -p /usr/local/foo
    将下载好的 foo 放入 /usr/local/foo
创建启动脚本
  • sudo nano /usr/local/foo/run.sh

    bash 复制代码
    #!/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.plist

    bash 复制代码
    <?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>
权限调整
  • 输入以下指令

    bash 复制代码
    sudo 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

相关推荐
皮卡车厘子1 天前
Mac 挂载目录
macos
良逍Ai出海1 天前
在 Windows & macOS 上安装 Claude Code,并使用第三方 Key 的完整教程
windows·macos
热爱生活的五柒1 天前
linux/mac/wsl如何使用claude code,并配置免费的硅基流动API?(官方的需要付费订阅)
linux·运维·macos
胖胖大王叫我来巡山2 天前
mac本地安装DataEase桌面版
macos
奋斗者1号2 天前
OpenClaw 部署方式对比:云端、WSL、Mac 本机、Ubuntu 虚拟机(2026年2月最新主流实践)
linux·ubuntu·macos
玉梅小洋2 天前
Android SDK 安装指南(MacOS 和 Windows)
android·windows·macos·sdk
2501_916007472 天前
没有 Mac 用户如何上架 App Store,IPA生成、证书与描述文件管理、跨平台上传
android·macos·ios·小程序·uni-app·iphone·webview
胖胖大王叫我来巡山2 天前
Mac通过源码安装部署SQLBOT
macos
June bug2 天前
【领域知识】广告全链路测试
macos·objective-c·cocoa
作孽就得先起床2 天前
Xcode设置中文
macos