Программы, запущенные из сеанса удалённого рабочего стола, останавливаются при выходе из этого сеанса и не запускаются снова после перезагрузки. Боты, игровые серверы, приложения на Node.js или Python, сборщики данных и торговые программы должны вместо этого стартовать автоматически вместе с Windows и сами перезапускаться при сбое. В статье три надёжных способа добиться этого в Windows Server: Планировщик заданий, бесплатная обёртка для служб NSSM и встроенные в Windows параметры восстановления служб.
| Способ | Подходит для | Перезапуск при сбое | Нужен вход пользователя в систему |
|---|---|---|---|
| Планировщик заданий, триггер «При запуске» | Скрипты и консольные программы | Да (параметры повторного запуска) | Нет |
| Служба NSSM | Долго работающие консольные приложения (Node.js, Python, Java, игровые серверы) | Да, сразу | Нет |
| Автовход + папка автозагрузки | Программы, которым нужно видимое окно или графический интерфейс | Нет | Да |
Откройте taskschd.msc и выберите Создать задачу (Create Task), а не «Создать простую задачу»:
То же задание через 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
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.
Если программа сама устанавливается как служба (база данных, игровой сервер, агент), настройте 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.
Если проблема не решена, создайте тикет — техническая поддержка IMIDC работает 24/7. Укажите IP сервера, версию Windows Server, программу, которую нужно запускать, и точный текст ошибки или запись журнала событий, чтобы мы быстрее нашли причину.