【技巧】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

相关推荐
元Y亨H1 天前
MacBook Air 开发神器:IDEA 与 PyCharm 极简安装及环境配置
macos
yuanyxh2 天前
macOS 应用 - 纯对话生成
前端·macos·ai编程
AI创界者4 天前
PilotTTS 一键整合包(Win/Mac):8G 显存畅跑,实测解锁情绪与副语言的精准控制
人工智能·macos·aigc·音视频
AirDroid_cn4 天前
系统终端与iTerm2字体看起来不一样?macOS Sequoia统一渲染指南
macos
JiaWen技术圈4 天前
2026 年的 macOS 磁盘清理方法
macos
lichong9514 天前
让AI自己用电脑!Cua:后台操作鼠标键盘,Mac/Windows/Linux全支持
人工智能·macos·ai·计算机外设·agent·提示词
A尘埃4 天前
批处理命令(Linux/Mac、Windows项目启动脚本)
linux·windows·macos
他们都不看好你,偏偏你最不争气5 天前
【iOS】Runtime - Part 2 && 消息发送:缓存、查找与转发
macos·ios·objective-c·cocoa
Deepzz5 天前
macOS 上调教第三方鼠标的一些经验:从滚动顺滑到输入法自动切换
macos·swift·鼠标