Как создать сервис: Создание сервиса Linux. Как создать свой сервис для Linux с Systemd

пишем собственные .service и .target / Хабр

У меня появился Linux на домашнем компьютере, и я поспешил обжиться в новой ОС. Она была установлена с systemd init process. Это было мое первое знакомство с этим новым инструментом. Cвой ноутбук я использую для каждодневной жизни и для программирования. Мне хотелось включать рабочие программы (Apache2 и MySQL) только на время, пока я их использую, чтобы не тратить впустую ресурсы своего компьютера. Дополнительно, для тестирования я написал bash скрипт, который выгружает содержимое одной из MySQL БД c жесткого диска в ОЗУ (в tmpfs) – так тесты выполняются значительно быстрее. По идее, я мог бы начинать свой рабочий день вот так:

systemctl start apache2.service
systemctl start mysqld.service
/root/scripts/mysqld-tmpfs start
И заканчивать его:

systemctl stop apache2.service
systemctl stop mysqld.service
/root/scripts/mysqld-tmpfs stop
Но мне хотелось сделать вещи “как надо”.

Чего я хотел?
Я хотел достичь 2 целей:

  1. Мне было лень писать 2 команды (запуск apache и запуск mysql), т.
    к. я знал, что обе программы всегда будут выключаться и включаться синхронно. Хотелось выполнять эту операцию одной командой.
  2. Дело попахивало неприятностями, если компьютер перезагрузится пока моя база данных будет сидеть в tmpfs – все файлы будут потеряны. Конечно, я делал бекапы, но мне опять же было лень восстанавливать их вручную после каждой непредвиденной перезагрузки.
Что я сделал?
В итоге я объединил Apache2 и MySQL в один target. Это позволило запускать оба сервиса одной командой. А свой mysqld-tmpfs скрипт я декларировал в виде сервиса в глазах systemd. Будучи сервисом, я уверен, что systemd выполнит его корректную остановку, если система пойдет на перезагрузку или еще в какую-то нештатную ситуацию, и моя БД без потерь сохранится на жесткий диск.

Что такое service?
Это некоторая программа, которая выполняется в фоне и предоставляет полезную функциональность. К примеру, Apache веб сервер. Сервисы можно запускать и останавливать.
Некоторые сервисы могут запускаться и останавливаться автоматически по определенным событиям (загрузка ОС, выгрузка ОС и тп). Так же их можно запускать/останавливать вручную. Сервис декларируется в /etc/systemd/system/my-name.service файлах (с суффиксом “.service”).

Что такое target?
Target в systemd очень похож на runlevel в openRC, но это все-таки разные вещи. Во-первых, target позволяет группировать 1 и более сервисов в единый блок. Группируя сервисы в targets, ими проще управлять. Во-вторых, systemd автоматически включает/выключает targets по событиям. “Включение” target означает включение всех сервисов, которые он объединяет в себе. К примеру, если в systemd настроен target по умолчанию my-favorite.target, то при загрузке системы systemd включит все сервисы, которые задекларированы внутри my-favorite.target. В какой-то момент в консоли можно набрать:

systemctl isolate my-another.target
Все сервисы из my-another.target будут включены, и все включенные сервисы не из my-another. target будут выключены. Это очень похоже на переключение runlevel в openRC. Однако, systemd поддерживает включение более чем 1 target. Вот пример:

# Эксклюзивно включаем my-favorite.target и выключаем все остальные сервисы
systemctl isolate my-favorite.target
# К уже запущенным сервисам и targets добавляем еще 1 target
systemctl start my-another.target
После выполнения этих команд в системе будет работать объединение сервисов из my-favorite.target и my-another.target.

Как я это сделал?
В итоге у меня получился вот такой mysqld-tmpfs.service файл:

Description=Mount a MySQL database into tmpfs.
# Мой /root/scripts/tmpfs скрипт может работать как при включенном, так и при выключенном mysql сервисе. Но если бы mysql сервис нужен был включенным, к примеру, то я бы добавил эти строки:
#Requires=mysqld.service
#After=mysqld.service
[Service]
# Даем знать systemd, что этот сервис представляет из себя лишь 1 процесс. Man page хорошо описывает доступные опции.
Type=oneshot # Выполнить эту команду при запуске сервиса. ExecStart=/root/scripts/mysqld-tmpfs start # Выполнить эту команду при остановке сервиса. ExecStop=/root/scripts/mysqld-tmpfs stop # Даем знать systemd, что сервис нужно считать запущенным, даже если основной процесс прекратил свою работу. Как раз то, что мне нужно: мой процесс выполнит монтировку и после этого прекратит свою работу, но должен считаться активным, т.к. монтировка осталась в системе. RemainAfterExit=yes
И вот такой programming.target файл:

[Unit]
Description=Working/Programming target
Requires=mysqld.service
Requires=apache2.service
# Сюда я могу дописывать новые сервисы “Requires=another.service”, если они мне понадобятся в повседневной работе.
Какие были проблемы?
При остановке programming.target почему-то нижележащие apache2.service и mysqld.service не останавливались. Почитав как следует man page, я нашел проблему: systemd останавливает сервисы “лениво” — если никто не требует запущенный сервис, и он не был запущен явным образом, а как зависимость для какого-то другого сервиса, то systemd остановит его только при одном из 3 обстоятельств:

  1. Запустится какой-то другой сервис, который в своей декларации указывает, что он конфликтует с нашим сервисом.
  2. Выполнится systemctl isolate some-another.target или systemctl stop this.service.
  3. Наш сервис может запросить в своей декларации останавливать себя не ленивым образом, а активным, добавив вот такую строку в [Unit] секцию: StopWhenUnneeded=true

Декларации “чужих” сервисов можно менять создавая файлы /etc/systemd/system/name-i-alter.service.d/*.conf. Я просто создал /etc/systemd/system/apache2.service/auto-stop.conf и /etc/systemd/system/mysqld.service.d/auto-stop.conf и поместил туда ту строку.

Другая проблема, на которую я, наткнулся была в том, что systemd не очень любит symlinks. Я не большой любитель “загаживать” системные директории типа /etc, /bin, /usr своими локальными продуктами жизнедеятельности, поэтому изначально я попытался свой /etc/systemd/system/mysqld-tmpfs.service сделать symlink на /root/scripts/mysqld-tmpfs.service файл, т.е. хранить сам файл в домашнем каталоге root пользователя. Но systemctl команда отказывалась работать с таким сервисом выдавая малопонятные ошибки. Оказалось, что определенную часть своей внутренней кухни systemd делает именно на symlinks, и ему тогда “трудно” отличать внутреннюю кухню (свои symlinks) от сторонних *.service файлов (если они тоже являются symlinks). Удалив symlink из /etc/systemd/system/mysqld-tmpfs.service и скопировав туда содержимое настоящего файла, я решил эту проблему. Более подробное описание этой проблемы можно прочитать тут: bugzilla.redhat.com/show_bug.cgi?id=955379

Результат
Я достиг своей цели. Начиная рабочий день:

systemctl start programming.target
Когда нужно выполнить тесты на своем проекте:

systemctl start mysqld-tmpfs.service
Когда я хочу демонтировать БД из tmpfs в жесткий диск (хотя на практике я так почти не делаю, а просто оставляю БД в tmpfs на целый день, и при выключении systemd за меня запускает демонтировку из tmpfs в жесткий диск):

systemctl stop mysqld-tmpfs.service
Когда я закончил работать и хочу остановить рабочие программы:

systemctl stop programming. target
Cheat sheet
Некоторые полезности при работе с systemd:

  • Вызывайте systemctl daemon-reload, если вы изменили декларацию чего-либо (systemd считает файлы декларации заново)
  • systemctl start my-name.(service|target) – запуск сервиса или target
  • systemctl stop my-name.(service|target) – остановка сервиса или target
  • systemctl enable my-name.service – сервисы могут декларировать при каких включенных targets они должны включаться. Для этого используется [Install] секция в файле декларации сервиса. Вы, как сисадмин, имеете власть на установку этого “пожелания” сервиса. Часто сервисы “устанавливаются” в target по умолчанию multi-user.target или в похожее.
  • systemctl disable my-name.service – обратная операция по отношению к enable: деассоциировать связь между my-name.service и targets, которые он запросил в [Install] секции своей декларации.
  • systemctl isolate my.target — включить все сервисы из my. target и выключить все остальные включенные сервисы.
  • systemctl status my-name.(service|target) — узнать статус (запущен/остановлен) у сервиса или target.

Надеюсь, эта статья кому-то поможет при осваивании systemd. Я попытался сделать ее компактной, и если упустил из внимания какие-то дополнительные вопросы, спрашивайте в комментариях!

Systemd в Linux: пишем собственные юниты.

Systemd в Linux: пишем собственные юниты.

Mira Unix30 дек. 2016Руководства4 мин.

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

Если вы когда-либо играли в стратегии, то наверняка помните, что юнитами там называли единицу любой разновидности войск. Лучник, инженер, большой шагающий робот — все это юниты.

В контексте systemd юниты — это отдельные объекты, которыми управляет эта система. Как и игровые войска, они имеют свои разновидности, у каждой из которых  есть свое предназначение. Если вы читали предыдущие статьи, то знаете как минимум одну разновидность таких объектов — сервисы. Вот некоторые другие виды юнитов, о которых я, возможно, расскажу в следующих статьях:

  • точки монтирования,
  • таймеры,
  • таргеты или цели,
  • устройства.

Основными директориями для хранения юнитов в Ubuntu 16.04 являются:

  • /lib/systemd/system — здесь находятся юниты, созданые автоматически при установке пакетов;
  • /etc/systemd/system
    — пользовательские, вернее, администраторские юниты.

Скриншот выше демонстрирует содержимое директории с файлами юнитов.

Файлы юнитов содержат разделы с набором параметров и их значений, разделенных знаком «=». Слева название параметра, справа значение, все предельно просто. Для начала создадим файл с названием my_backup.service и поместим его в /etc/systemd/system. Впишем в него следующие строки:

[Unit]
Description = Backups my folder with projects
[Service]
RemainAfterExit=true
ExecStop=/usr/local/bin/my_backup
Type=oneshot
[Install]
WantedBy=multi-user.target

Идея этого решения принадлежит человеку с ником mezcalero из IRC чата systemd.

Давайте разберем представленный выше код.

Раздел [Unit] хранит общие сведения о юните. В данном случае он содержит только описание (Description).

Раздел [Service] объединяет сведения, необходимые для выполнения юнитом его задач. Type определяет тип сервиса (не путайте его с разновидностями юнитов), oneshot означает, что сервис должен выполнить разовую задачу и завершиться. ExecStop указывает скрипт, который должен быть выполнен перед остановкой сервиса. Есть еще ExecStart, этот параметр используется чаще и определяет команду, которая должна быть выполнена сразу после запуска сервиса. RemainAfterExit=true предписывает systemd считать процесс активным после его завершения.

Секция [Install] содержит сведения о том, при каких обстоятельствах должен быть запущен сервис. WantedBy=multi-user.target устанавливает запуск при обычной загрузке компьютера.

Но это еще не все. Скрипт, который мы указали в качестве значения ExecStop, на данный момент не существует.

#!/bin/bash
current_date="$(date +'%F_%H_%M')"
tar -czf /полный/путь/к/месту/хранения/резервной/копии/$current_date.tar.gz /полный/путь/к/папке/которую/нужно/архивировать

Приведенный выше код нужно поместить в файл /usr/local/bin/my_backup, а затем сделать его исполняемым:

sudo chmod +x /usr/local/bin/my_backup

Хотя наш скрипт совсем простой, давайте все же разберем его. Первая строка — обязательное начало любого bash скрипта. Вторая получает текущую дату и время в определенном нами формате и помещает ее в переменную current_date. Третья запускает архиватор и сообщает ему, что и куда архивировать. Кстати, не забудьте подставить свои пути вместо русского текста.

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

sudo systemctl enable my_backup  
sudo systemctl start my_backup

Обратите внимание: в команде выше я использовал mybackup, а не mybackup.service, хотя подразумевал именно это. Дело в том, что если тип юнита не указан, предполагается, что это .serivice. Полный вариант сработал бы точно так же.

Перезагрузите компьютер и проверьте, появился ли архив в указанном месте.

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

Далеко не всегда нужно писать собственный скрипт при создании сервиса systemd. Зачастую сервисные файлы пишутся с целью управления уже существующими программами, путь к которым определяется параметрами ExecStart или ExecStop. Наш скрипт тоже использует существующую программу — tar. По большому счету, можно было обойтись и вовсе без него, сразу прописав все необходимые параметры в сервисном файле. Я включил его создание в статью только с целью демонстрации самой возможности. Но пользовательский скрипт все же будет полезен, если вы захотите усложнить задачу: отослать уведомление на электронную почту, удалить самый старый из архивов и т. д.

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

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


Если у вас возникли вопросы.

Приглашаю задавать их на сервисе вопросов и ответов: Ask.LinuxRussia.com.

Там ваши вопросы не потеряются и вы быстрее получите ответ, в отличие от комментариев.


Поделиться:

Комментарии для сайта Cackle
Статистика

Количество опубликованных статей:

66

Количество опубликованных заметок:

3

Нравится Сайт? Подпишись!

И получай самые свежие новости с сайта!

Следить за новостями сайта в Telegram:

Подписывайтесь на наш канал в Telegram: @linuxrussia

Для этого достаточно иметь Telegram на любом устройстве и пройти по ссылке: https://telegram.me/linuxrussia.

Следить за новостями сайта в Twitter:

Читать @LinuxRussia

Подписывайтесь на нашу группу ВКонтакте:

Подписаться на новости

Подписывайтесь на основную RSS ленту:

Подписывайтесь на RSS ленту заметок:

Последние заметки

Как включить отображение пароля в виде звездочек в терминале LinuxПроверка кода ответа сервераКак узнать, используется Xorg или Wayland

Последние комментарии
Цикл статей о терминале Linux

1. Терминал Linux. Команды навигации в терминале.2. Терминал Linux. Создание, удаление, копирование, перемещение, переименование файлов и директорий.3. Терминал Linux. Как сохранить в файл вывод терминала.4. Терминал Linux. Команды поиска файлов и директорий.5. Терминал Linux. Команды просмотра текстовых файлов.6. Терминал Linux. Права доступа к каталогам и файлам в Linux, команды chmod и chown.7. Терминал Linux. Создание alias (псевдонима) в Ubuntu.8. Терминал Linux. Горячие сочетания клавиш для Bash.

Цикл статей о systemd

1. Systemd: больше, чем просто демон.2. Systemd как средство диагностики неисправностей в Linux.3. Systemd в Linux: пишем собственные юниты.4. Автоматическое резервное копирование на Яндекс.Диск средствами systemd.5. Полезные инструменты, которые предоставляет systemd.

Цикл статей о Samba

1. Настройка файлового обмена между Windows и Ubuntu.2. Samba. Установка и простая настройка.3. Samba. Управление доступом.4. Samba. Графические и Web-интерфейсы.5. Подключаем сервер с Samba к домену Windows6. Samba в роли контроллера домена Active Directory

Цикл статей об OpenVPN

1. Установка и настройка сервера OpenVPN.2. Установка и настройка консольного клиента OpenVPN в Ubuntu.3. Настройка клиентских устройств OpenVPN.

Статьи о восстановлении данных в Linux

1. Foremost — программа для восстановление утраченных данных в домашних условиях.2. Scalpel: современный инструмент восстановления данных.3. The Sleuth Kit + Autopsy — набор для поиска и восстановления данных.4. Восстановление данных с помощью TestDisk.

Цикл статей о KDE

0. Анонс цикла статей о KDE.1. Способы запуска программ и открытия окон.2. Чего ждать от этой рабочей среды?3. Настройка видео.4. Что такое Комнаты?5. Обзор интересных виджетов Plasma.6. Стили оформления.7. Контекстное меню Dolphin, полезные скрипты и создание собственных действий.8. Marble — виртуальный глобус.9. KDE Connect — программа для связи компьютера и Android-смартфона. 10. Skrooge — программа управления финансами.

Серия статей о файловых системах Linux

1. Файловые системы Linux. Ext4.2. Файловые системы Linux. Btrfs.3. Файловые системы Linux. Tmpfs и Zram.

Цикл статей о LAMP

1. LAMP в Ubuntu: базовая установка и настройка компонентов веб-сервера.2. LAMP в Ubuntu: apache2.conf и .htaccess3. LAMP в Ubuntu: виртуальные хосты.

Создать определяемую пользователем службу — клиент Windows

Редактировать

Твиттер LinkedIn Фейсбук Электронная почта

  • Статья

В этой статье описаны действия по созданию определяемой пользователем службы Windows NT.

Применяется к:   Windows 10 — все выпуски
Исходный номер базы знаний:   137890

Важно

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

Сводка

Набор ресурсов Windows NT содержит две утилиты, которые позволяют создавать определяемые пользователем службы Windows NT для приложений Windows NT и некоторых 16-разрядных приложений, но не для пакетных файлов.

Instrsrv.exe устанавливает и удаляет системные службы из Windows NT, а Srvany.exe позволяет запускать любое приложение Windows NT как службу.

Действия по созданию определяемой пользователем службы

Чтобы создать определяемую пользователем службу Windows NT, выполните следующие действия:

  1. В командной строке MS-DOS (запустив CMD.EXE) введите следующую команду:

     путь \INSTSRV.EXE Путь к моей службе \SRVANY. EXE
     

    , где путь — это диск и каталог набора ресурсов Windows NT (например, C:\RESKIT ) и Моя служба — это имя создаваемой вами службы.

    Пример: C:\Program Files\Resource Kit\Instsrv.exe Блокнот C:\Program Files\Resource Kit\Srvany.exe

    Примечание

    Чтобы убедиться, что служба была создана правильно, проверьте реестр, чтобы убедиться, что значение ImagePath в разделе HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Services\service name указывает на SRVANY.EXE. Если это не установлено правильно, служба остановится вскоре после ее запуска и вернет идентификатор события 7000 ( имя службы не удалось запустить).

    Предупреждение

    Неправильное использование редактора реестра может привести к серьезным проблемам, которые могут потребовать переустановки операционной системы. Microsoft не может гарантировать решение проблем, возникающих в результате неправильного использования редактора реестра. Используйте Редактор реестра на свой страх и риск.

    Для получения сведений о том, как редактировать реестр, просмотрите следующие разделы интерактивной справки в редакторе реестра:

    • Изменение ключей и значений
    • Добавление и удаление информации в реестре
    • Редактировать данные реестра

    Примечание

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

  2. Запустите редактор реестра (Regedt32.exe) и найдите следующий подраздел:

    HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Services\<Моя служба>

  3. В меню Редактировать выберите Добавить ключ . Введите следующие записи и выберите OK :

    • Имя ключа: Параметры
    • Класс: <оставьте пустым>
  4. Выберите клавишу Параметры .

  5. В меню Редактировать выберите Добавить значение . Введите следующие записи и выберите OK :

    • Имя значения: Приложение
    • Тип данных: REG_SZ
    • Строка: <путь>\

    где \ — это диск и полный путь к исполняемому файлу приложения, включая расширение (например, C:\WinNT\Notepad.exe)

  6. Закрыть редактор реестра.

По умолчанию вновь созданная служба настроена на автоматический запуск при перезапуске системы. Чтобы изменить этот параметр на Manual , запустите апплет «Службы» из панели управления. Затем измените значение Startup на 9.0028 Руководство . Службу, установленную на , вручную , можно запустить одним из нескольких способов:

  • Из апплета Службы в Панели управления

  • В командной строке MS-DOS введите следующую команду:

     NET START <Моя служба>
     
  • Используйте утилиту Sc. exe из Resource Kit. Введите следующую команду из командной строки MS-DOS:

     <путь>\Sc.exe запустить <моя служба>
     

    , где <путь> — это диск и каталог набора ресурсов Windows NT (например, C:\Reskit ).

Дополнительные сведения об установке и удалении определяемой пользователем службы см. в документе Srvany.wri, входящем в комплект утилит Windows NT Resource Kit (например, C:\Reskit\Srvany.wri ). Этот документ также можно найти на компакт-диске Windows NT Resource Kit в каталоге Common\Config .

Сбор данных

Если вам нужна помощь службы поддержки Майкрософт, мы рекомендуем вам собрать информацию, выполнив шаги, описанные в разделе Сбор информации с помощью TSSv2 для решения проблем, связанных с развертыванием.

Создать службу Windows из исполняемого файла

спросил

Изменено 2 месяца назад

Просмотрено 930 тысяч раз

Есть ли какой-нибудь быстрый способ, используя исполняемый файл, создать службу Windows, которая при запуске запускает его?

  • окна
  • окна-сервисы
1

Чтобы создать службу Windows из исполняемого файла, вы можете использовать sc. exe :

 sc.exe create  binPath= ""
 

Фактический путь exe должен быть заключен в кавычки, а после binPath= должен быть пробел.

Дополнительная информация о sc 9Команду 0053 можно найти в Microsoft KB251192.

Обратите внимание, что это не будет работать только для любого исполняемого файла: исполняемый файл должен быть службой Windows (т. е. реализовывать ServiceMain). При регистрации неслужебного исполняемого файла в качестве службы вы получите следующую ошибку при попытке запустить службу:

Ошибка 1053: Служба своевременно не ответила на запрос запуска или управления.

Существуют инструменты, которые могут создавать службы Windows из произвольных, неслужебных исполняемых файлов, примеры таких инструментов см. в других ответах.

6

Используйте NSSM ( не-Sucking Service Manager ) для запуска . BAT или любого .EXE-файла в качестве службы.

http://nssm.cc/

  • Шаг 1 : Загрузите NSSM
  • Шаг 2 : Установите службу с помощью nssm.exe install [serviceName]
  • Шаг 3 : откроется графический интерфейс, который вы будете использовать для поиска исполняемого файла
  • .
12

Расширение ответа (Кевин Тонг).

Шаг 1: Загрузите и распакуйте nssm-2.24.zip

Шаг 2: Из командной строки введите:

C:\> nssm.exe install [servicename]

откроет графический интерфейс, как показано ниже. (например, сервер UT2003), затем просто перейдите по адресу: yourrapplication.exe

Дополнительная информация: https://nssm.cc/usage

9

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

 sc create  binpath= ""
sc остановить 
sc queryex <имя_службы>
sc удалить 
 

Если в имени службы есть пробелы, заключите их в кавычки.

0

Многие существующие ответы включают вмешательство человека во время установки. Это может быть процесс, подверженный ошибкам. Если у вас есть много исполняемых файлов, которые вы хотите установить в качестве служб, последнее, что вы хотите сделать, — это выполнить их вручную во время установки.

Для описанного выше сценария я создал serman, инструмент командной строки для установки исполняемого файла в качестве службы. Все, что вам нужно написать (и написать только один раз), — это простой файл конфигурации службы вместе с вашим исполняемым файлом. Запустите

 serman install 
 

установит службу. stdout и stderr регистрируются. Для получения дополнительной информации посетите веб-сайт проекта.

Рабочий файл конфигурации очень прост, как показано ниже. Но он также имеет много полезных функций, таких как и ниже.

 <услуга>
  привет
  <имя>привет
  Эта служба запускает приложение приветствия
  <исполняемый файл>node.exe
  
  "{{dir}}\hello.js"
  повернуть
  
  
  
  

 
1

То же, что и ответ Сергея Пожарова, но с командлетом PowerShell:

 New-Service -Name "MyService" -BinaryPathName "C:\Path\to\myservice. exe"
 

Дополнительные сведения о настройке см. в разделе New-Service .

Это будет работать только для исполняемых файлов, которые уже реализуют API служб Windows.

1

Я протестировал для этого хороший продукт: AlwaysUp. Не бесплатно, но у них есть 30-дневный пробный период, так что вы можете попробовать...

Несколько лет назад я создал кроссплатформенное программное обеспечение Service Manager, чтобы я мог запускать PHP и другие языки сценариев в качестве системных служб в Windows. , Mac и ОС Linux:

https://github.com/cubiclesoft/service-manager

Service Manager — это набор предварительно скомпилированных двоичных файлов, которые устанавливают и управляют системной службой в целевой ОС, используя почти идентичные параметры командной строки. (также доступен исходный код). Каждая платформа имеет тонкие различия, но основные функции в основном нормализованы.

Если дочерний процесс умирает, Service Manager автоматически перезапускает его.

Процессы, запущенные с помощью Service Manager, должны периодически отслеживать два файла уведомлений для обработки запросов на перезагрузку и перезагрузку, но это необязательно. Service Manager принудительно перезапустит дочерний процесс, если он своевременно не отвечает на контролируемые запросы на перезапуск/перезагрузку.

Вы можете проверить мою небольшую бесплатную утилиту для операций создания\редактирования\удаления сервиса. Вот пример создания:

Перейдите в Сервис -> Изменить -> Создать

Исполняемый файл (Google Диск): [Скачать]

Исходный код: [Скачать]

Сообщение в блоге: [BlogLink]

Класс редактора сервиса: WinServiceUtils.cs

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

SrvAny (установлен InstSrv)

как описано здесь: https://learn.microsoft.com/en-us/troubleshoot/windows-client/deployment/create-user-defined-service

1

Некоторые из лучших ответов указывают на NSSM. Этот проект не обновлялся с 2017 года.

Более современная альтернатива аналогичной функциональности — https://github.com/winsw/winsw/ — содержит множество примеров и хорошую документацию.

Совет для удобства использования, который помог мне настроить его быстрее, чем NSSM: если вы назовете исполняемый файл winsw как myapp.exe и создадите файл конфигурации XML myapp.xml , вы просто запускаете myapp.exe install и myapp.exe запускаете и вуаля, служба работает.

У меня есть другой метод, использующий библиотеку с открытым исходным кодом под названием Topshelf. Я использовал его в проекте С#, но, возможно, он доступен на разных языках программирования.

Вот видео, которое немного объясняет, как его использовать. https://www.youtube.com/watch?v=y64L-3HKuP0

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

Добавить комментарий

Ваш адрес email не будет опубликован. Обязательные поля помечены *