Запуск програми як служби windows (через nssm)

Чи можна запустити клієнтську програму в якості служби? Чи не кожне консольний додаток зможе запуститися як служба, а програми з графічним інтерфейсом в принципі не вміють працювати подібним чином. Але можливість запустити додаток як службу все ж є, і допоможе нам в цьому програма з оригінальною назвою Non-Sucking Service Manager.

Для демонстрації можливостей NSSM спробуємо запустити Блокнот Windows в якості служби на Windows 8.1.

створення служби

Для створення служби з ім'ям notepad запускаємо командну консоль, переходимо в папку з розпакованим NSSM (для 64-розрядної Windows) і вводимо команду nssm install notepad, яка відкриває вікно графічного інсталятора NSSM. Щоб створити службу, досить в поле Path вказати шлях до виконуваного файлу і натиснути кнопку "Install service". Додатково в поле Options можна вказати ключі, необхідні для запуску служби.

Запуск програми як служби windows (через nssm)

Також на етапі створення нової служби можна вказати деякі додаткові параметри.

На вкладці "Shutdown" перераховані методи зупинки і тайм-аути, використовувані при штатному завершенні роботи або аварійної зупинки програми. Коли NSSM отримує команду зупинки (напр. При виході з), то він намагається зупинити контрольоване додаток штатним чином. Якщо ж програма не відповідає, то NSSM може примусово завершити всі процеси і підпроцеси цього додатка.

Всього є чотири етапи завершення роботи програми, і за замовчуванням вони використовуватиметься в такому порядку:

• На першому етапі NSSM намагається згенерувати і відправити подія Ctrl + C. Цей спосіб добре працює для консольних додатків або скриптів, але не застосуємо для графічних додатків;
• Потім NSSM визначає всі вікна, створені додатком, і посилає їм повідомлення WM_CLOSE, ініціює вихід з програми;
• Третім етапом NSSM обчислює всі потоки, створені додатком, і відправляє їм повідомлення WM_QUIT, яке буде отримано якщо програма має чергу повідомлень потоку;
• І, як крайня міра NSSM може викликати метод TerminateProcess (), примусово завершивши роботу програми.

Можливо відключити деякі або навіть всі методи, однак для різних додатків спрацьовують різні методи і для коректного завершення роботи програми рекомендується залишити все як є.

Запуск програми як служби windows (через nssm)

За замовчуванням при падінні служби NSSM намагається рестартовать її. На вкладці "Exit actions" можна змінити автоматичну дію при позаштатному виході з, а також виставити затримку перед автоматичним перезапуском додатка.

Запуск програми як служби windows (через nssm)

На вкладці "Input / Output (I / O)" можна задати перенаправлення вводу \ виводу додатки в зазначений файл.

Запуск програми як служби windows (через nssm)

На вкладці "Environment" можна задати для служби нові змінні оточення, або перевизначити існуючі.

Запуск програми як служби windows (через nssm)

Також можна не користуватися графічною оболонкою і відразу створити службу в консолі такою командою:

nssm install notepad 'C: \ Windows \ system32 \ notepad.exe'

управління службою

Після створення служби за допомогою NSSM зайдемо в оснастку Services і знайдемо службу notepad. Як бачите, на вигляд вона нічим не відрізняється від інших служб, ми також можемо її запустити, зупинити або змінити режим запуску. Однак зверніть увагу, що в якості виконуваного файлу вказано nssm.exe.

Запуск програми як служби windows (через nssm)

А якщо зайти в Task Manager, то ми побачимо наступну картину: в якості основного (батьківського) процесу запущений NSSM, служба notepad запущена як його дочірній процес, і вже в цьому дочірньому процесі запущено додаток Блокнот.

Запуск програми як служби windows (через nssm)

видалення служби

Для видалення служби вводимо команду nssm remove notepad і підтверджуємо її видалення. А ввівши команду nssm remove notepad confirm, можна обійтися і без підтвердження.

Запуск програми як служби windows (через nssm)

Запуск служби в інтерактивному режимі

Основна відмінність призначеного для користувача додатки від служби полягає в тому, що після запуску додаток може вимагати для продовження роботи додаткових дій з боку користувача - наприклад натиснути кнопку або ввести команду. Для цього необхідно отримати до нього доступ, що як виявляється, не так-то просто зробити.

Запуск програми як служби windows (через nssm)

Запуск програми як служби windows (через nssm)

Після чого відкриваємо консоль PowerShell і стартуємо службу виявлення командою:

Start-Service -Name ui0detect

Запуск програми як служби windows (через nssm)

Переконавшись що служба виявлення запущена, рестартуем службу notepad, і отримуємо ось таке віконце. Вибираємо пункт "Переглянути допис"

Запуск програми як служби windows (через nssm)

і потрапляємо в нульовий сеанс, в якому працює наш додаток. Далі виробляємо з ним необхідні дії і повертаємося назад.

Запуск програми як служби windows (через nssm)