【技巧】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 Mini在几个知识库项目的部署实践
人工智能·macos·大模型·mac mini·边缘算力·知识库应用
小镇学者2 天前
【python】macos环境升级自己安装的python3
开发语言·python·macos
TESmart碲视2 天前
解锁多屏办公效率:2026年深度解析EDID技术与KVM切换器解决方案
macos·计算机外设·kvm切换器·tesmart·双屏kvm切换器·tesmart碲视
我的golang之路果然有问题2 天前
mac 上进行 comfyUI 等绘画的好处以及分享
人工智能·macos·ai作画·人工智能作画·comfy
奔跑的呱呱牛2 天前
解决MacOS下Chrome嗯下F5不刷新页面的问题
chrome·macos·mac
叶之道2 天前
MacOS 配置 Qt 开发环境
qt·macos
2501_916007472 天前
在没有 Mac 的情况下完成 iOS 应用上架 App Store
android·macos·ios·小程序·uni-app·iphone·webview
软件小滔3 天前
我使用MAC WiFi Explorer Pro完成了一次家庭网络“大扫除”
网络·macos·智能路由器·mac·应用推荐·wifi explorer
不爱吃糖的程序媛3 天前
Kuikly-OH 实践(mac版本)
macos
活蹦乱跳酸菜鱼3 天前
MAC 发出的一个帧(MAC Frame)及其完整的帧格式
网络·macos