macos开机自动执行shell脚本

在 macOS 上设置开机或用户登录后自动执行 Shell 脚本,最现代且可靠的方法是使用 launchd。这是 Apple 官方推荐的用于管理守护进程和服务的系统。

相比于老旧的 crontab 或简单的“登录项”,launchd 提供了更强大的控制能力和稳定性。

1.1 解决方案:使用 launchd 创建用户代理 (User Agent)

这个方法会在登录到 Mac 用户账户后,自动以后台方式执行指定的脚本。

1.1.1 📝 第 1 步:创建 .plist 配置文件

首先,创建一个 .plist 格式的 XML 配置文件。这个文件会告诉 launchd 要做什么。

  1. 打开“终端” (Terminal) 应用程序。

  2. 创建一个新的 .plist 文件。~/Library/LaunchAgents/com.user.jetbrains-activate.plist。这个目录是存放用户级别 launchd 任务的地方。

    1
    vi ~/Library/LaunchAgents/com.user.jetbrains-activate.plist
  3. 将以下内容粘贴到编辑器中:

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    <!-- ~/Library/LaunchAgents/com.user.jetbrains-activate.plist -->
    <?xml version="1.0" encoding="UTF-8"?>
    <!DOCTYPE plist PUBLIC "-//Apple//DTD PLIST 1.0//EN" "http://www.apple.com/DTDs/PropertyList-1.0.dtd">
    <plist version="1.0">
    <dict>
    <key>Label</key>
    <string>com.user.jetbrains-activate</string>

    <key>ProgramArguments</key>
    <array>
    <string>/bin/zsh</string>
    <string>/Users/username/Environments/JetBrainsActivateTools/scripts/install.sh</string>
    </array>

    <key>RunAtLoad</key>
    <true/>

    <!-- === 调试日志部分 === -->
    <key>StandardOutPath</key>
    <string>/Users/username/tmp/jetbrains-activate.stdout.log</string>
    <key>StandardErrorPath</key>
    <string>/Users/username/tmp/jetbrains-activate.stderr.log</string>
    <!-- ======================= -->
    </dict>
    </plist>

  4. 重要:修改脚本路径!
    请将上面代码中的 /Users/username/ 替换成您自己的实际用户名称。例如,如果您的用户名是 david,那么路径就是 /Users/david/Environments/JetBrainsActivateTools/scripts/install.sh

  5. 保存并退出编辑器。

1.1.2 ⚙️ 第 2 步:确保脚本具有执行权限

为了让 launchd 能够成功运行您的脚本,您必须给脚本文件添加可执行权限。

在终端中运行以下命令:

1
chmod +x /Users/username/Environments/JetBrainsActivateTools/scripts/install.sh

同样,记得替换 username 为您的实际用户名。

1.1.3 🚀 第 3 步:加载并启动 launchd 任务

现在,您需要告诉 launchd 加载您刚刚创建的这个新任务。

  1. 加载任务:
    在终端中运行以下命令,它会加载您的 .plist 文件并使其生效。

    1
    launchctl load ~/Library/LaunchAgents/com.user.jetbrains-activate.plist
  2. (可选) 立即测试:
    如果您想立即测试脚本是否能被 launchd 正常执行,而不是等下次登录,可以运行以下命令来手动启动一次任务:

    1
    launchctl start com.user.jetbrains-activate

    您可以检查脚本执行后的预期效果来判断是否成功。

  3. 如果修改了 plist 文件,那么必须先 卸载 (unload) 然后再 加载 (load) 任务。

    1
    2
    launchctl unload ~/Library/LaunchAgents/com.user.jetbrains-activate.plist
    launchctl load ~/Library/LaunchAgents/com.user.jetbrains-activate.plist

1.2 ✨ 一切就绪

现在,您的设置已经全部完成。从下一次您登录 Mac 开始,install.sh 脚本就会在后台自动为您执行。

1.3 其他信息与管理命令

  • 为什么要用 /bin/sh
    ProgramArguments 中,第一个参数是执行器,第二个参数才是您的脚本。直接使用 /bin/sh/bin/zsh 来运行您的 .sh 脚本是更稳妥的做法。

  • 如何停止并卸载这个自动任务?
    如果您以后不希望再自动执行此脚本,可以按以下步骤操作:

    1. 卸载任务:

      1
      launchctl unload ~/Library/LaunchAgents/com.user.jetbrains-activate.plist
    2. (可选)删除文件:

      1
      rm ~/Library/LaunchAgents/com.user.jetbrains-activate.plist
  • 如果脚本需要管理员权限怎么办?
    如果您的脚本需要 sudo 权限,那么配置会更复杂。您需要将 .plist 文件放置在系统的 /Library/LaunchDaemons 目录下,并修改一些键值。但根据您的需求(在当前用户下执行),目前的方法是最佳选择。