【技巧】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 天前
升级到 macOS26.5 后看视频会自动息屏的解决
macos·操作系统
磊 子1 天前
C++ IO 流
macos·objective-c·cocoa
real_haha1 天前
我做了一个仅有 1.3 MB 的 macOS 原生 AI 助手:AskNow
人工智能·macos
June bug2 天前
(Mac)macOS x86_64上onnxruntime==1.24.4 安装失败
macos
ACP广源盛139246256732 天前
iOS 27 开放 AI 生态@ACP#小型化扩展黄金风口,IX8008全面超越 ASM2806,铸就嵌入式 AI 扩展核心
人工智能·嵌入式硬件·macos·ios·计算机外设·objective-c·cocoa
海的辽阔2 天前
如何在MAC下安装EcomGpt模型
macos·大模型·ecomgpt
zandy10112 天前
hermes agent 安装教程 3.0:Win / Mac / Linux 全平台指南
linux·运维·macos
花开·莫之弃2 天前
Mac安装多版本jdk(jenv)
java·开发语言·macos
June bug2 天前
(Mac)torch==2.1.2 与 Python 3.12 不兼容+onnxruntime-silicon 不支持 Intel Mac
开发语言·python·macos
码农小北2 天前
MAC 配置鸿蒙(HarmonyOS) SDK 环境变量完整指南
macos·华为·harmonyos