Windows 开机自启
启动文件夹
Win + R
调出 运行
,复制粘贴以下命令回车打开 启动文件夹
,将要自启程序的 快捷方式
放入即可。
- 当前用户
- "%APPDATA%\Microsoft\Windows\Start Menu\Programs\Startup"
- 所有用户
- "%PROGRAMDATA%\Microsoft\Windows\Start Menu\Programs\Startup"
计划任务
另一种方式是 计划任务
,以 管理员身份
打开 CMD
,输入以下命令回车。其中,<TaskName>
是计划任务 名称
。<TaskRun>
是所要启动程序的 完整路径
,如果包含 空格
,要加 英文引号
。
- 创建任务
- schtasks /create /sc ONSTART /tn <TaskName> /tr <TaskRun>
- REM 一个例子
- schtasks /create /sc ONSTART /tn AIDA64StartOnBoot /tr "C:\Program Files (x86)\AIDA64 Extreme\aida64.exe"
- 删除任务
- schtasks /delete /tn <TaskName>
隐藏窗口
对于命令行程序,通过上述方式启动是会出现窗口的,如果想 无窗口运行
,可借助 VBS
脚本或 系统
用户计划任务。这两种方式可能被杀毒软件拦截,需要手动添加例外。
- VBS
将下面的代码复制粘贴到记事本,替换 <Program>
,它代表所要运行程序的 完整路径
,如果包含 空格
,要加 英文引号
。0
代表隐藏窗口。
- Set WshShell = WScript.CreateObject("WScript.Shell")
- Dim exeName
- exeName = "<Program>"
- WshShell.Run exeName, 0
最后将其保存为 xxx.vbs
,如 AIDA64StartOnBoot.vbs
,放到上文介绍的 启动文件夹
,计划任务不支持 VBS。
- SYSTEM 计划任务
对于缺少 VBS
组件的盗版系统,还可利用 SYSTEM
与当前用户的 Session
隔离,通过系统用户启动计划任务来隐藏窗口。
以 管理员身份
打开 CMD
,复制粘贴以下命令,修改任务名称 <TaskName>
和程序路径 <TaskRun>
,回车执行。加上 cmd /C start
,是为了给计划任务模块提供 正常退出
返回值,以便输出运行成功日志。
- schtasks /create /sc ONSTART /tn <TaskName> /tr "cmd /C start <TaskRun>" /ru SYSTEM
笔记本仅电池供电下计划任务的启动
通过 schtasks
简单接口添加的计划任务,默认仅会在有电源供电时运行。如果想在仅电池供电时仍然启动,可通过 XML
以编程方式创建,亦可手动到任务计划模块界面修改。
下面的 XML 文件中,Task - Settings - DisallowStartIfOnBatteries - false
代表电池供电仍然启动,其他元素含义自行阅读。
- <?xml version="1.0" encoding="UTF-16"?>
- <Task version="1.2" xmlns="http://schemas.microsoft.com/windows/2004/02/mit/task">
- <Principals>
- <Principal id="Author">
- <RunLevel>HighestAvailable</RunLevel>
- </Principal>
- </Principals>
- <Triggers>
- <LogonTrigger>
- <Enabled>true</Enabled>
- </LogonTrigger>
- </Triggers>
- <Settings>
- <DisallowStartIfOnBatteries>false</DisallowStartIfOnBatteries>
- <StopIfGoingOnBatteries>false</StopIfGoingOnBatteries>
- <RunOnlyIfNetworkAvailable>false</RunOnlyIfNetworkAvailable>
- <Hidden>true</Hidden>
- </Settings>
- <Actions Context="Author">
- <Exec>
- <Command>%WINDIR%\System32\cmd.exe</Command>
- <Arguments>/C start "PROGRAM"</Arguments>
- </Exec>
- </Actions>
- </Task>
将上述配置复制到记事本中,修改 Task - Actions - Exec - Arguments
元素中的 PROGRAM
,它代表所要启动程序的 完整路径
。修改完毕后,将其保存为 xxx.xml
。最后,以管理员身份打开 CMD
,通过以下命令创建计划任务。其中,<TaskName>
为任务名称。<XMLPath>
为刚刚保存的 XML 文件的完整路径。如果路径中含 空格
,加 英文引号
。
- schtasks /create /tn <TaskName> /xml <XMLPath> /ru system
Windows 服务注册
虽然上文介绍了隐藏窗口启动命令行程序的方式,但它们没有 运行状态
,无法被 SC
模块管理,异常
退出不能自动 恢复
,不是真正的后台 服务
。
通常情况下,一个程序要能被注册为 Service
,必须调用特定的 Win32 API
,即在源码层面实现。对于这些程序,比如 Subvision
,直接使用 SC
模块即可管理服务,如
- REM 创建服务
- sc create SVNService binpath="C:\Program Files\Subvision\bin\svnserve.exe --service -r D:\SVN" start=auto
-
- REM 启动服务
- net start SVNService
-
- REM 停止服务
- net stop SVNService
-
- REM 删除服务
- sc delete SVNService
对于其他程序,如果无源码或修改源码成本较高,可借助 NSSM
代理注册服务。该程序开源,所以自身不会带毒。
首先下载 NSSM,将其解压到软件目录,最后注册到 Path
中。如果嫌麻烦可直接通过 Win + R
,输入 %WINDIR%
回车,将 nssm.exe
丢进打开的文件夹中。
现在,以 管理员身份
打开 CMD
,通过下面的命令添加和删除服务。其中,<ServiceName>
是服务名称,可自定义。<ProgramPath>
是要启动程序的 完整路径
,如果包含空格,加 英文引号
。
- 注册服务
- nssm install <ServiceName> <ProgramPath>
- 删除服务
- nssm remove <ServiceName>
Linux 开机自启和服务注册
现在主流版本的 Linux 系统都使用 systemd
管理服务,使用方式也很简单,以 Aria2
为例。首先,在 /etc/systemd/system/
目录下添加配置文件,如 aria2.service
- cat > /etc/systemd/system/aria2.service <<EOF
- [Unit]
- Description=Aria2 Service
- Requires=network-online.target
-
- [Service]
- Type=forking
- ExecStart=/usr/bin/aria2c --conf-path=/usr/local/etc/aria2/aria2.conf
- Restart=on-failure
-
- [Install]
- WantedBy=multi-user.target
- EOF
上述配置涉及选项的含义如下:
Option | Description |
---|---|
Description | 服务描述 |
Requires | 如果某个服务停止,自身也停止 |
Type | 如果 ExecStart 后,程序自动后台运行,使用 forking;如果程序需要长期运行且不能自动后台,使用 simple;如果程序完成任务后即可退出,使用 oneshot |
ExecStart | 服务启动后执行哪个程序 |
Restart | 异常重启 |
WantedBy | 被其他服务依赖,其他服务启动后,唤醒自己 |
随后便可使用下面的命令管理服务。
- # 加载配置
- systemctl daemon-reload
-
- # 开机自启
- systemctl enable aria2
-
- # 取消自启
- systemctl disenable aria2
-
- # 启动
- systemctl start aria2
-
- # 停止
- systemctl stop aria2
-
- # 查看运行状态
- systemctl status aria2
macOS 开机自启和服务注册
与 systemd
对应,macOS 下管理服务的程序是 launchd
。仍以 Aria2 为例,首先添加配置文件 /Library/LaunchDaemons/aria2.plist
- cat > /Library/LaunchDaemons/aria2.plist <<EOF
- <?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>Aria2 Service</string>
- <key>ProgramArguments</key>
- <array>
- <string>/usr/local/bin/aria2c</string>
- <string>--conf-path=/usr/local/etc/aria2.conf</string>
- </array>
- <key>KeepAlive</key>
- <true/>
- <key>RunAtLoad</key>
- <true/>
- </dict>
- </plist>
- EOF
上述配置涉及的关键选项含义如下:
Option | Description |
---|---|
dict - string | 服务描述 |
dict - array - string | 服务启动后要执行的程序,及参数 |
dict - key - KeepAlive | 异常重启 |
dict - key - RunAtLoad | 加载配置后立即启动 |
随后便可使用下面的命令管理服务。
- # 减小权限
- chmod 644 /Library/LaunchDaemons/aria2.plist
-
- # 加载配置
- launchctl load /Library/LaunchDaemons/aria2.plist
-
- # 卸载配置
- launchctl unload /Library/LaunchDaemons/aria2.plist
-
- # 停止运行
- launchctl stop aria2
参考资料
- https://www.freedesktop.org/wiki/Software/systemd/NetworkTarget/
- https://serverfault.com/questions/812584/in-systemd-whats-the-difference-between-after-and-requires
如有问题请在下方留言,文章转载请注明出处,详细交流请加下方群组!请大佬不要屏蔽文中广告,因为它将帮我分担服务器开支,如果能帮忙点击我将万分感谢。
强调几点:(该留言由系统自动生成!)
1. 请不要刷广告,本站没有流量!
2. 我不回复虚假邮箱,因为回复了你也看不到!
3. 存在必须回复的隐藏内容时,可以直接使用表情框里的阿鲁表情!