Информация об изменениях в платформе и прикладных решениях на нашем официальном телеграм канале. Подписывайтесь!

Запуск приложения Гедымин в виде службы Windows

Для запуска приложения как службы необходима программа Non-Sucking Service Manager.

NSSM представляет из себя свободное программное обеспечение с открытым кодом и поддерживает все операционные системы Microsoft, начиная с Windows 2000 и заканчивая Windows 10. NSSM не требует установки, достаточно его загрузить и распаковать. В дистрибутив входят версии для 32- и 64-разрядных ОС. Взять программу можно с сайта nssm.cc.

Создание службы

Для создания службы с именем gedemin_service запускаем командную консоль, переходим в папку с распакованным NSSM (для 64-разрядной Windows) и вводим команду nssm install gedemin_service, которая открывает окно графического инсталлятора NSSM. Чтобы создать службу необходимо: в поле Path указать путь к исполняемому файлу программы, в поле Arguments указать сетевой путь к базе данных, а также аутентификационные данные пользователя. Например:

/sn "srv94:C:\Golden\gedemin\database\MENU_FRONT.FDB" /user Import /password 123

Всё готово - можно нажать кнопку «Install service». Дополнительно в поле Options можно указать ключи, необходимые для запуска службы.

Path — полный путь к gedemin.exe;

Startup directory — путь к папке с файлом gedemin.exe;

Arguments — параметры, с которыми служба будет запускать gedemin.exe. Требуемый формат: /sn "<сетевое имя копьютера или IP>:<путь к базе данных>" /user <имя пользователя> /password <пароль>. Больше о дополнительных параметрах можно узнать здесь.

 

Также на этапе создания новой службы можно указать некоторые дополнительные параметры.


На вкладке «Shutdown» перечислены методы остановки и таймауты, используемые при штатном завершении работы или аварийной остановке приложения. Когда NSSM получает команду остановки (напр. при завершении работы приложения), то он пытается остановить контролируемое приложение штатным образом. Если же приложение не отвечает, то NSSM может принудительно завершить все процессы и подпроцессы этого приложения.


Всего есть четыре этапа завершения работы приложения, и по умолчанию они будет использоваться в таком порядке:

  1. На первом этапе NSSM пытается сгенерировать и отправить событие Ctrl+C. Этот способ хорошо работает для консольных приложений или скриптов, но не применим для графических приложений;
  2. Затем NSSM определяет все окна, созданные приложением, и посылает им сообщение WM_CLOSE, инициирующее выход из приложения;
  3. Третьим этапом NSSM вычисляет все потоки, созданные приложением, и отправляет им сообщение WM_QUIT, которое будет получено если приложение имеет очередь сообщений потока;
  4. И в качестве последнего средства NSSM может вызвать метод TerminateProcess(), принудительно завершив работу приложения.

Возможно отключить некоторые или даже все методы, однако для разных приложений срабатывают разные методы и для корректного завершения работы приложения рекомендуется оставить все как есть.

По умолчанию при падении службы NSSM пытается рестартовать ее. На вкладке «Exit actions» можно изменить автоматическое действие при нештатном завершении работы приложения, а также выставить задержку перед автоматическим перезапуском приложения.

На вкладке «Input/Output (I/O)» можно задать перенаправление ввода\вывода приложения в указанный файл.

На вкладке «Environment» можно задать для службы новые переменные окружения, или переопределить существующие.

Также можно не пользоваться графической оболочкой и сразу создать службу в консоли такой командой:
nssm install gedemin_service ″d:\Golden_Software\gedemin.exe″

Управление службой

После создания службы с помощью NSSM зайдем в оснастку Services и найдем службу gedemin_service. Как видите, с виду она ничем не отличается от остальных служб, мы также можем ее запустить, остановить или изменить режим запуска. Однако обратите внимание, что в качестве исполняемого файла указан nssm.exe.

После запуска службы, зайдя в Task Manager, мы увидим: в качестве основного (родительского) процесса запущен NSSM, служба gedemin_service запущена как его дочерний процесс, так же запущено приложение «Гедымин».

Удаление службы

Для удаления службы вводим команду nssm remove gedemin_service и подтверждаем ее удаление. А введя команду nssm remove gedemin_service confirm, можно обойтись и без подтверждения.

Запуск нескольких задач одновременно

Специалист по внедрению и сопровождению Александр Моисеев поделился с нами решением проблемы, когда несколько служб запускаются одновременно:

на базе периодически отваливалась служба, созданная nssm для импорта продаж, которая запускалась раз в 5 минут. Причем, в определенный момент, служба "зависала" и функция, которую она должна была выполнять, не вызывалась, что доставляло проблемы для учета. Приходилось вручную перезапускать службу, но в определенный момент она снова "падала".

Что только не делалось: изучался лог винды на предмет посторонних операций. Менялось время активности функции импорта (автозадачи). Устанавливались разные параметры перезапуска в настройках nssm.

Оказывается: если на одного пользователя определено два и более задания через службу, то появляется комфликт, который мешает работе службы, причем он нигде не сохранял инфу (ни логе FB, ни где-то еще).

Решение пришло следующее: был добавлен новый пользователь с правами админа для запуска автозадачи и добавлена еще одна служба для архива (для указанного выше пользователя). Таким образом каждая автозадача разнесена на отдельную службу, созданную nssm и выполняемую под своим пользователем.