【技巧】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 天前
Flutter-MacOS桌面OS系统|flutter.+window_manager客户端OS模板
flutter·macos·策略模式
代码对我眨眼睛1 天前
macOS Google Chrome 常用快捷键
前端·chrome·macos
啊真真真1 天前
macOS下libnfc ..写卡失败问题及解决方案
macos·策略模式
叶 落1 天前
Mac 通过 Miniconda 安装 Python
python·macos·conda·miniconda
it-电商达人2 天前
告别手动对齐!Mac播放器Popvee Player支持本地AI自动生成字幕
人工智能·macos
2501_916008892 天前
iOS IPA文件反编译与打包操作方法,拆包分析防护和加固打包
android·macos·ios·小程序·uni-app·cocoa·iphone
凯丨2 天前
2GB 内存跑 Gemma 4 26B 模型:TurboFieldfare Mac 本地部署实测(2026 最新)
macos
for_ever_love__2 天前
iOS:天气预报仿写总结
macos·ui·ios·objective-c·cocoa
开开心心就好2 天前
电脑内存优化工具一键释放内存超简单
java·开发语言·macos·arcgis·ocr·excel·音视频
Tester Kid3 天前
Appium 元素定位深度讲解:五种方式逐个拆 + Inspector 完整用法
macos·appium·cocoa