管理开机启动项

mac

Mac 上可以利用 launchctl 来管理开机启动项。

  1. 在目录 ~/Library/LaunchAgents 或者 /Library/LaunchAgents 下创建 plist 配置文件
  2. aria2 的服务端进程为例,zyf.aria2.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>KeepAlive</key>
        <true/>
        <key>Label</key>
        <string>zyf.aria2</string>
        <key>ProgramArguments</key>
        <array>
            <string>/usr/local/bin/aria2c</string>
            <string>--enable-rpc</string>
        </array>
        <key>RunAtLoad</key>
        <true/>
    </dict>
</plist>
  1. 完成上面的时候,你会在系统桌面通知看到一条 已经添加开机启动项 的通知。此时,你下次登录账号的时候,自定义配置就会生效。也可以立即手动启动:
launchctl load zyf.aria2.plist # 立即加载并启动
launchctl unload zyf.aria2.plist # 停止正在运行的进程

linux

因为我平时只使用 systemd 管理的 linux 系统。所以这里这里只说怎么使用 systemctl 来管理开机启动项。

这里以和上面 mac 举例相同的 aria2 的服务进程为例来说明。
配置文件名这里我命名为 aria2-server.service

  1. systemctl 的几个基本的管理命令
systemctl status aria2-server # 查看服务的状态
systemctl start aria2-server # 启动服务
systemctl stop aria2-server # 停止服务
systemctl restart aria2-server # 重启服务
systemctl enable aria2-server # 添加开机启动
systemctl disable aria2-server # 移除开机启动
journal -f -u aria2-server # 持续查看服务的日志(-u 为指定单元名,-f 为持续跟踪的意思)
  1. 放置配置文件的目录
    • /lib/systemd/system
    • /lib/systemd/user
    • /etc/systemd/system
    • /etc/systemd/user
    • ~/.config/systemd/user

除了最后一个用户文件夹的,前面几个目录都是系统级别的。有一些进程需要运行的系统级别比如代理软件 trojan,就需要放置在系统目录里面。
我举例说明的用到的 aria2-server.service 可以运行用户级别。我将它放置在了 ~/.config/systemd/user 目录。
放在这里的配置需要在运行控制指令的时候加上 --user 选项。例如: systemctl --user status aria2-server

  1. 重载配置 当添加、删除、更新了服务的配置,需要重载才能让 systemd 知道有变化。需要执行指令
systemctl [--user] daemon-reload # 如果是用户级别的服务,则需要 --user 选项

windows

windows 提供了很多种管理开机启动项的手段。

  1. 通过快捷方式启动

使用快捷键 win + r 呼出运行指令窗口,输入 shell::startup
此时文件管理器会打开一个路径为 xxx/程序/启动 的目录。
在这个目录创建一个快捷方式指向你需要启动的程序就可以了。

通过这种方式创建的开机启动项可以在任务管理器的 启动应用 标签页进行管理。

  1. 通过注册表来添加

在注册表路径: HKEY_CURRENT_UESR\Software\Windows\CurrentVersion\Run 添加字符串类型的值即可。 例如在 win11 上,edge 浏览器为了自己启动快速,添加了一个:

MicrosoftEdgeAutoLaunch: "C:\Program Files (x86)\Microsoft\Edge\Application\msedge" --no-startup-window --win-session-start

通过 edge 的这里例子可以了解到,配置进程路径的时候可以指定命令行参数。程序文件的路径如果有空格需要用双引号包裹。

通过这种方式创建的开机启动项也可以在任务管理器的 启动应用 标签页进行管理。

  1. 通过计划任务来添加(较简单,不介绍)
  2. 通过创建服务来添加(需要管理员权限,不介绍)

在 windows 上创建的启动项如果进程自己不支持隐藏窗口,就需要借助一些三方手段来实现。
除了使用 创建服务 的形式来启动其它几种默认都会有一个 cmd 窗口。
为了隐藏这个窗口,可以借助:

  • hidexec
  • powershell 的 start-process 指令的参数 -WindowStyle Hidden
  • vbs (过时了,不介绍)

我个人比较喜欢 powershell 的窗口隐藏模式来启动进程。这种方式启动进程后,父进程会退出更节省内存。
hideexec 会保留 cmd 进程,因此更占内存一点。
附上一段使用 powershell 创建 aria2 服务的例子:

Start-Process -WindowStyle Hidden -FilePath aria2c -ArgumentList '--enable-rpc'