Текущая ситуация
Я использую сервер Linux (Arch). У меня есть серверное приложение, которое выполняется следующим образом:
run_server filename --port=xxxx
Я написал файлы служб systemd. Каждый из них поддерживает процессы для определенного файла на определенном порту. Когда я хочу обслужить новый файл, я копирую файл службы systemd, редактирую его, задаю ему новый порт и включаю/запускаю новую службу.
Это большой объем ручной работы, поскольку файлы часто добавляются и удаляются группой людей.
Запрос
Если у меня есть каталог файлов
directory/firstfile
directory/secondfile
....
Я хочу сохранить активным один процесс для каждого файла:
run_server firstfile --port=9001
run_server secondfile --port=9002
...
При удалении файла из каталога процесс должен останавливаться. При добавлении файла в каталог должен запускаться новый процесс.
Как мне этого добиться?
решение1
Хорошо, я воспользовался советами двух комментаторов.
Создан файл шаблонного юнита systemd ( )
/etc/systemd/system/[email protected]
[Service] Type=simple ExecStart=/../run_server %i ...
Создайте службу пути systemd (
/etc/systemd/system/sync_server_units.path
), которая отслеживает каталог[Path] PathModified=/path/to/directory ...
Это запускает (
/etc/systemd/system/sync_server_units.service
), который представляет собой простой run_once:[Service] Type=oneshot ExecStart=/../sync_server_units
Наконец, у меня есть скрипт (
sync_server_units
), который сравнивает содержимое каталога с выводомsystemctl list-units --all 'run_server@*'
и включает/запускает/останавливает/отключает шаблонную службу по мере необходимости.
Пока все работает хорошо!