Windows 服务器

Windows 服务器程序 24 小时挂机:任务计划程序开机自启、NSSM 注册为服务与崩溃自动重启

5 个步骤 8 分钟阅读 14 次阅读 0
本文目录

从远程桌面会话中启动的程序,会在该会话注销时停止,服务器重启后也不会自动恢复。机器人、游戏服务器、Node.js 或 Python 应用、数据采集程序和交易工具等,应该随 Windows 自动启动,并在崩溃后自动重启。本文介绍在 Windows Server 上实现这一目标的三种可靠方法:任务计划程序、免费的服务封装工具 NSSM,以及 Windows 自带的服务恢复设置。

直接关闭远程桌面窗口(断开连接)时程序会继续运行,但选择注销(Sign out)、触发会话自动超时或服务器重启都会关闭程序。凡是需要 7×24 小时运行的程序,都不要依赖一直开着的远程桌面会话。

应该选择哪种方法?

方法适用场景崩溃后自动重启需要保持桌面登录
任务计划程序“启动时”触发脚本和控制台程序是(通过重试设置)否
NSSM 服务长期运行的控制台程序(Node.js、Python、Java、游戏服务器)是,立即重启否
自动登录 + 启动文件夹需要显示窗口或图形界面的程序否是

方法 1:任务计划程序开机启动

打开 taskschd.msc,选择创建任务(Create Task)(不要选“创建基本任务”):

  1. 常规(General):选择不管用户是否登录都要运行(Run whether user is logged on or not)和使用最高权限运行(Run with highest privileges)。
  2. 触发器(Triggers):新建 → 启动时(At startup);可以勾选延迟任务时间(Delay task for)并设为 30 秒,等网络就绪后再启动。
  3. 操作(Actions):启动程序,填写程序或脚本的完整路径,并在起始于(Start in)中填写其所在文件夹。
  4. 设置(Settings):勾选如果任务失败,按以下频率重新启动(If the task fails, restart every),设为 1 分钟,最多重试 999 次;对于长期运行的程序,请取消勾选如果任务运行时间超过以下时间,停止任务(Stop the task if it runs longer than)。

也可以用 PowerShell 创建同样的任务:

$action   = New-ScheduledTaskAction -Execute "C:\apps\collector\collector.exe" -WorkingDirectory "C:\apps\collector"
$trigger  = New-ScheduledTaskTrigger -AtStartup
$trigger.Delay = "PT30S"
$settings = New-ScheduledTaskSettingsSet -RestartCount 999 -RestartInterval (New-TimeSpan -Minutes 1) `
            -ExecutionTimeLimit ([TimeSpan]::Zero) -StartWhenAvailable
Register-ScheduledTask -TaskName "Collector" -Action $action -Trigger $trigger -Settings $settings `
            -User "SYSTEM" -RunLevel Highest

Start-ScheduledTask -TaskName "Collector"
Get-ScheduledTaskInfo -TaskName "Collector"   # LastTaskResult 0 = success

方法 2:用 NSSM 将任意程序注册为服务

NSSM(Non-Sucking Service Manager)可以把任意可执行文件封装成真正的 Windows 服务,程序退出时会立即将其重启,并能把控制台输出写入日志文件。从 nssm.cc 下载后,将 nssm.exe(位于 win64 文件夹中)复制到 C:\Windows\System32,然后执行:

# Example: a Node.js application
nssm install MyApp "C:\Program Files\nodejs\node.exe" "C:\apps\myapp\server.js"
nssm set MyApp AppDirectory C:\apps\myapp
nssm set MyApp AppStdout C:\apps\myapp\logs\out.log
nssm set MyApp AppStderr C:\apps\myapp\logs\error.log
nssm set MyApp AppRotateFiles 1
nssm set MyApp AppRotateBytes 10485760
nssm set MyApp Start SERVICE_AUTO_START
nssm start MyApp

nssm status MyApp
nssm restart MyApp
nssm edit MyApp       # graphical editor for all settings
nssm remove MyApp confirm

Python 脚本请使用 python.exe 的路径,并把脚本作为参数;Java 程序请使用 java.exe 并加上参数 -jar app.jar。如果程序需要访问网络共享或用户配置文件,请在 Log on 选项卡(通过 nssm edit 打开)中指定运行账户,而不是使用 LocalSystem。

方法 3:为现有服务配置恢复选项

如果程序本身已经安装为服务(例如数据库、游戏服务器或监控代理),可以让 Windows 在其故障时自动重启:

# Restart after 5 seconds on the first three failures; reset the failure counter after one day
sc.exe failure "MyService" reset= 86400 actions= restart/5000/restart/5000/restart/5000
sc.exe failureflag "MyService" 1
sc.exe config "MyService" start= auto
sc.exe qfailure "MyService"

这些选项也可以在服务属性的恢复(Recovery)选项卡中设置(打开 services.msc 后双击该服务)。

需要显示桌面窗口的程序

服务运行在一个隔离的会话中,没有可见的桌面,因此必须显示窗口的图形界面程序(如部分交易终端、游戏客户端、自动化工具)无法以服务方式运行。对于这类程序,可以使用 Microsoft Sysinternals 的 Autologon 工具为一个专用用户启用自动登录(密码会加密保存),把程序的快捷方式放入该用户的 shell:startup 文件夹,离开远程桌面时选择断开连接而不是注销。同时,请将该用户排除在会话自动注销的时间限制之外。

常见问题

任务状态显示“正在运行”,但程序并没有正常工作?

检查是否设置了起始于(Start in)(或 NSSM 的 AppDirectory):很多程序会按工作目录的相对路径查找配置文件。同时查看程序自身的日志;如果使用 NSSM,还要查看 AppStderr 指定的日志文件。

服务启动后立即停止?

在 PowerShell 窗口中手动执行完全相同的命令,查看报错信息。对于服务,还可以查看事件查看器 → Windows 日志 → 系统(Event Viewer → Windows Logs → System)和应用程序(Application)日志。

Windows 更新重启后程序还会自动运行吗?

会。开机启动任务和自动启动的服务在每次重启后都会再次启动,这正是它们比一直开着远程桌面会话更可靠的原因。如需控制重启时间,请参见管理 Windows 更新。

如果按以上步骤操作后问题仍未解决,请提交工单联系 IMIDC 7×24 技术支持,并附上服务器 IP、Windows Server 版本、需要运行的程序,以及具体的报错信息或事件日志记录,方便工程师快速定位。

这篇文章有帮助吗?

相关教程