пишем собственные .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 целей:- Мне было лень писать 2 команды (запуск apache и запуск mysql), т.
- Дело попахивало неприятностями, если компьютер перезагрузится пока моя база данных будет сидеть в 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 обстоятельств:- Запустится какой-то другой сервис, который в своей декларации указывает, что он конфликтует с нашим сервисом.
- Выполнится systemctl isolate some-another.target или systemctl stop this.service.
- Наш сервис может запросить в своей декларации останавливать себя не ленивым образом, а активным, добавив вот такую строку в [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, выполните следующие действия:
В командной строке 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 не может гарантировать решение проблем, возникающих в результате неправильного использования редактора реестра. Используйте Редактор реестра на свой страх и риск.
Для получения сведений о том, как редактировать реестр, просмотрите следующие разделы интерактивной справки в редакторе реестра:
- Изменение ключей и значений
- Добавление и удаление информации в реестре
- Редактировать данные реестра
Примечание
Вы должны сделать резервную копию реестра, прежде чем редактировать его.
Запустите редактор реестра (Regedt32.exe) и найдите следующий подраздел:
HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Services\<Моя служба>
В меню Редактировать выберите Добавить ключ . Введите следующие записи и выберите OK :
- Имя ключа: Параметры
- Класс: <оставьте пустым>
Выберите клавишу Параметры .
В меню Редактировать выберите Добавить значение . Введите следующие записи и выберите OK :
- Имя значения: Приложение
- Тип данных: REG_SZ
- Строка: <путь>\
где
\ — это диск и полный путь к исполняемому файлу приложения, включая расширение (например, C:\WinNT\Notepad.exe) Закрыть редактор реестра.
По умолчанию вновь созданная служба настроена на автоматический запуск при перезапуске системы. Чтобы изменить этот параметр на 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, которая при запуске запускает его?
- окна
- окна-сервисы
Чтобы создать службу Windows из исполняемого файла, вы можете использовать sc. exe
:
sc.exe createbinPath= " "
Фактический путь 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 : откроется графический интерфейс, который вы будете использовать для поиска исполняемого файла .
Расширение ответа (Кевин Тонг).
Шаг 1: Загрузите и распакуйте nssm-2.24.zip
Шаг 2: Из командной строки введите:
C:\> nssm.exe install [servicename]
откроет графический интерфейс, как показано ниже. (например, сервер UT2003), затем просто перейдите по адресу: yourrapplication.exe
Дополнительная информация: https://nssm.cc/usage
9эти дополнения оказались полезными.. должны быть выполнены от имени администратора
sc createbinpath= " " sc остановить sc queryex <имя_службы> sc удалить
Если в имени службы есть пробелы, заключите их в кавычки.
0Многие существующие ответы включают вмешательство человека во время установки. Это может быть процесс, подверженный ошибкам. Если у вас есть много исполняемых файлов, которые вы хотите установить в качестве служб, последнее, что вы хотите сделать, — это выполнить их вручную во время установки.
Для описанного выше сценария я создал serman, инструмент командной строки для установки исполняемого файла в качестве службы. Все, что вам нужно написать (и написать только один раз), — это простой файл конфигурации службы вместе с вашим исполняемым файлом. Запустите
serman install
установит службу. stdout
и stderr
регистрируются. Для получения дополнительной информации посетите веб-сайт проекта.
Рабочий файл конфигурации очень прост, как показано ниже. Но он также имеет много полезных функций, таких как
и
ниже.
<услуга>1привет <имя>приветЭта служба запускает приложение приветствия <исполняемый файл>node.exe"{{dir}}\hello.js" повернуть
То же, что и ответ Сергея Пожарова, но с командлетом 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 в качестве службы, если вы не используете старый метод, который Использовался Томег.