Windows Server

Запуск программы как службы Windows Server 24/7: NSSM, планировщик, автоперезапуск

5 шагов 14 мин чтения 19 просмотров 0
Содержание

Программы, запущенные из сеанса удалённого рабочего стола, останавливаются при выходе из этого сеанса и не запускаются снова после перезагрузки. Боты, игровые серверы, приложения на Node.js или Python, сборщики данных и торговые программы должны вместо этого стартовать автоматически вместе с Windows и сами перезапускаться при сбое. В статье три надёжных способа добиться этого в Windows Server: Планировщик заданий, бесплатная обёртка для служб NSSM и встроенные в Windows параметры восстановления служб.

Если просто закрыть окно удалённого рабочего стола (отключиться), программы продолжат работать, но команда Выход (Sign out), автоматическое ограничение времени сеанса или перезагрузка их закроют. Не полагайтесь на открытый сеанс ни в чём, что должно работать 24/7.

Какой способ выбрать?

СпособПодходит дляПерезапуск при сбоеНужен вход пользователя в систему
Планировщик заданий, триггер «При запуске»Скрипты и консольные программыДа (параметры повторного запуска)Нет
Служба 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.

Программы, которым нужно окно на рабочем столе

Службы работают в изолированном сеансе без видимого рабочего стола, поэтому GUI-программы, которым нужно показывать окно (некоторые торговые терминалы, игровые клиенты, средства автоматизации), не будут работать как службы. Для них включите автоматический вход отдельного пользователя с помощью утилиты Autologon из набора Sysinternals от Microsoft (она хранит пароль в зашифрованном виде), положите ярлык программы в папку shell:startup этого пользователя и, уходя из сеанса удалённого рабочего стола, отключайтесь, а не выходите из системы. Также исключите этого пользователя из автоматического завершения сеансов по времени.

Частые вопросы

Задание в состоянии «Работает», но программа не работает

Проверьте, что заполнено поле Рабочая папка (или AppDirectory в NSSM): многие программы ищут файлы конфигурации относительно рабочего каталога. Также посмотрите собственные логи программы, а для NSSM — файл AppStderr.

Служба запускается и сразу останавливается

Выполните ту же самую команду вручную в окне PowerShell, чтобы увидеть ошибку. Для служб также проверьте журналы Просмотр событий → Журналы Windows → Система (Event Viewer → Windows Logs → System) и Приложение (Application).

Переживёт ли это перезагрузки после обновлений Windows?

Да. Задания при запуске и службы с автоматическим запуском стартуют заново после каждой перезагрузки — именно поэтому они лучше открытого сеанса удалённого рабочего стола. Чтобы управлять временем перезагрузок, см. статью об управлении обновлениями Windows.

Если проблема не решена, создайте тикет — техническая поддержка IMIDC работает 24/7. Укажите IP сервера, версию Windows Server, программу, которую нужно запускать, и точный текст ошибки или запись журнала событий, чтобы мы быстрее нашли причину.

Помог ли вам данный ответ?

Похожие руководства