mac开机启动项设置

将脚本设为开机自启

非sudo的自启脚本

mac下,网上可查到脚本开机自启方法众多,经验证,有效的方法包括不限于以下两种

不推荐的方法

以下方法,不管是否勾选隐藏,都会造成开机时弹出“终端.app”或"iTerm2.app"窗口,以运行脚本。我希望是完全隐藏的运行,不要弹出窗口。

  • 直接将要开机运行的脚本(如xxx.shxxx.sh)设为可执行(无需设成777,可执行就好)

    chmod +x 【脚本】
  • 将该脚本的自动打开软件设为“终端.app”或"iTerm2.app"

  • 然后将此脚本添加到开机自启项

推荐的方法

以下方法,设置便捷,且开机完全隐藏运行(不弹出任何窗口)

创建一个“自动操作”的“应用程序”

将应用程序添加到开机自启项

在系统偏好设置中,如下操作

点击隐藏表示开机时App的窗口不在屏幕上弹出

需要sudo的自启脚本

不推荐的方法

com.apple.loginwindow LoginHook: launchctl是苹果官方推荐的开机自启方法, 功能比此法更强大

launchctl

教程 案例参考

launchctl是苹果官方推荐的开机自启方法. 支持开机自启/用户登录自启,支持守护进程(周期性运行、持续运行),支持用sudo或普通用户运行

配置步骤

  • 编写自己的脚本, 添加可执行权限

    • 注意, 要用 sh 来测试运行, 而不是用bashsh
    chmod a+x 【myscript】.sh
  • 编写Launchd配置文件, 【服务名称】.plist文件(【服务名称】可以包含"."), 文件内写入如下内容

    • 文件名与下文的Label字段必须相同
    <?xml version="1.0" encoding="UTF-8"?>
    <!DOCTYPE plist PUBLIC "-//Apple Computer//DTD PLIST 1.0//EN" "http://www.apple.com/DTDs/PropertyList-1.0.dtd">
    <plist version="1.0">
        <dict>
            <key>Label</key>
            <string>【服务名称】</string>
            <key>ProgramArguments</key>
            <array>
                <string>【myscript.sh的路径】</string>
            </array>
            <key>RunAtLoad</key>
            <true/>
        </dict>
    </plist>
    • 检查.plist文件语法是否正确
    plutil 【.plist文件】
  • 结合上述两篇文章, 确定.plist文件放在系统启动还是用户启动时运行脚本, 我选择的是用户目录(~/Library/LaunchAgents/)

    plist脚本存放在以下目录:

    类型 目录 运行条件 用于
    User Agents ~/Library/LaunchAgents 当前用户登录后运行 由用户自己定义的任务项
    Global Agents /Library/LaunchAgents 任何用户登录后都会运行 由管理员为用户定义的任务项
    Global Daemons /Library/LaunchDaemons 内核初始化加载完后就运行, 无需用户登录 由管理员定义的守护进程任务项
    System Agents /System/Library/LaunchAgents 任何用户登录后都会运行 由Mac OS X为用户定义的任务项
    System Daemons /System/Library/LaunchDaemons 内核初始化加载完后就运行, 无需用户登录 由Mac OS X定义的守护进程任务项
  • load这个配置:

    launchctl load -w 【.plist文件】

    以下服务如果需要用sudo才能启动的,需要在命令前加入sudo

  • 登入登出测试, 或用如下命令测试

    launchctl start 【服务名称】

launchctl 命令用法

sudo则为root用户的launchctl, 不加sudo则为当前用户的launchctl.

  • 加载启动任务, 加-w则此后每次登录/开机仍然加载, 否则不加载

    [sudo] launchctl load [-w]【.plist文件路径】
  • 卸载启动任务, 加-w则此后每次登录/开机则不再加载, 否则仍加载

    [sudo] launchctl load [-w]【.plist文件路径】
  • 查看服务运行状态:

    [sudo] launchctl list
    • 第一个数字是进程的PID,如果它正在运行,如果它不运行,它显示一个’ - ‘
    • 第二个数字是进程的退出代码(如果它已经完成),如果是负数,则是杀死信号的数量
    • 第三列是进程名称

    image-20211020192441451

将应用程序设置为开机自启

法一【推荐】

系统偏好设置-用户与群组-登录项加上xxx.app并勾选隐藏,则登录系统用户后:

  • 应用程序的前台窗口不会开(若勾选隐藏)/会开(若勾除隐藏
  • 屏幕下方程序坞中会出现这个应用的图标,并带有一个小白点(带有一个小白点,表示程序正在运行)
  • 若该应用程序有相应的任务栏图标,则屏幕右上方也会出现它

法二(当法一失效时使用)

系统偏好设置-用户与群组-登录项 去掉XXX.app的开机自启

Automator.app创建一个隐藏打开Folx.app, 内部使用applescript, applescript内容为

  • 后台开启应用程序

    on run {input, parameters}
        tell application "XXX" to launch
        tell application "System Events" to set visible of process "XXX" to false
    end run

    而后,在系统偏好设置-安全性与隐私-隐私-辅助功能里, 添加隐藏打开XXX.app, 以便使得它能够如上面代码那样调用"System Events”

tell application "应用程序名称" to launch是后台开启,即:应用程序的窗口不会开

  • 前台开启应用程序

    on run {input, parameters}
        tell application "XXX" to activate
    end run

    tell application "应用程序名称" to activate是前台开启,即:应用程序的窗口会开

而后,在系统偏好设置-用户与群组-登录项里, 添加隐藏打开XXX.app

则登录系统用户后, XXX.app的前台窗口全程都不会/会启动;屏幕右上方的任务栏中会出现XXX程序;屏幕下方的程序坞也会出现带小白点的XXX.app(带有一个小白点,表示程序正在运行)。

异常开机自启的软件

Folx.app

在Folx软件内部设置里没有开机自启的选项。

若在系统偏好设置-用户与群组-登录项加上Folx.app,并勾选隐藏,则登录系统用户后, Folx的前台窗口不会开;程序坞中会出现这个应用的图标,并带有一个小白点(带有一个小白点,表示程序正在运行);任务栏图标会出现Folx的图标。

SideNotes.app

在软件内部的设置里, 勾选开机自启后, 在系统偏好设置-用户与群组-登录项里却没有此app. 登录系统用户后, 会闪现一个标题为”windows”, 内容为空的窗口, 一秒左右消失.

解决办法: 则软件内部的设置里, 勾除开机自启; 而后在系统偏好设置-用户与群组-登录项里, 勾选此app, 并选中隐藏. 登录系统用户后, 不会有此闪现的窗口.

qv2ray.app

在qv2ray软件内部设置里, 勾选开机自启后, 则在系统偏好设置-用户与群组-登录项里有qv2ray.app。 登录系统用户后, 会显示qv2ray的主窗口(即代理节点列表的窗口), 并不会自动关闭前台窗口

解决办法: 则软件内部的设置里, 勾除qv2ray的开机自启, 而后在系统偏好设置-用户与群组-登录项里此软件会自动消失. 用Automator.app创建一个隐藏打开qv2ray.app, 内部使用applescript, 内容为

on run {input, parameters}
    tell application "qv2ray" to activate
    tell application "System Events"
        keystroke "W" using {command down}
    end tell
end run

并在系统偏好设置-安全性与隐私-隐私-辅助功能里, 添加隐藏打开qv2ray.app, 以便使得它能给"System Events”发送快捷键.

而后, 在系统偏好设置-用户与群组-登录项里, 添加隐藏打开qv2ray.app. 则登录系统用户后,屏幕右上方的任务栏中会出现qv2ray, qv2ray主窗口只会闪现一秒就消失, 而后qv2ray保持后台运行,且屏幕下方的程序坞qv2ray的带小白点会消失(带有小白点表示程序正在运行)。