MENU

在主流系统下注册自启服务

2020 年 09 月 06 日 • 阅读: 10244 • 脚本

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

上述配置涉及选项的含义如下:

OptionDescription
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

上述配置涉及的关键选项含义如下:

OptionDescription
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

参考资料

TG 大佬群 QQ 大佬群

最后编辑于: 2021 年 08 月 03 日
返回文章列表 文章二维码
本页链接的二维码
打赏二维码
添加新评论

Loading captcha...

  • OωO
  • |´・ω・)ノ
  • ヾ(≧∇≦*)ゝ
  • (☆ω☆)
  • (╯‵□′)╯︵┴─┴
  •  ̄﹃ ̄
  • (/ω\)
  • ∠( ᐛ 」∠)_
  • (๑•̀ㅁ•́ฅ)
  • →_→
  • ୧(๑•̀⌄•́๑)૭
  • ٩(ˊᗜˋ*)و
  • (ノ°ο°)ノ
  • (´இ皿இ`)
  • ⌇●﹏●⌇
  • (ฅ´ω`ฅ)
  • (╯°A°)╯︵○○○
  • φ( ̄∇ ̄o)
  • ヾ(´・ ・`。)ノ"
  • ( ง ᵒ̌皿ᵒ̌)ง⁼³₌₃
  • (ó﹏ò。)
  • Σ(っ °Д °;)っ
  • ( ,,´・ω・)ノ"(´っω・`。)
  • ╮(╯▽╰)╭
  • o(*////▽////*)q
  • >﹏<
  • ( ๑´•ω•) "(ㆆᴗㆆ)
  • (。•ˇ‸ˇ•。)
  • 泡泡
  • 阿鲁
  • 蛆音娘
  • 小埋
  • 颜文字

已有 2 条评论
  1. 强调几点:(该留言由系统自动生成!)
    1. 请不要刷广告,本站没有流量!
    2. 我不回复虚假邮箱,因为回复了你也看不到!
    3. 存在必须回复的隐藏内容时,可以直接使用表情框里的阿鲁表情!

  1. zeruns zeruns   Windows 10 x64 Edition  Google Chrome 78.0.3904.108

    那个 windows 开机自启(windows server 系统)能在启动系统后但没有登录用户的情况下自启吗,我试了很多都是必须你手动登录一下才能启动

    1. LOGI LOGI   Windows 10 x64 Edition  Google Chrome 85.0.4183.121

      @zerunsNSSM 应该可以