Захотел реализовать с помощью systemd автоматический запуск скриптов в директории с определённой иерархией при их изменении или добавлении.
Структура директории такая:
test
├── test1
│ └── script.sh
├── test2
│ └── script.sh
└── test3
└── script.sh
Есть шаблоны test@.service
и test@.path
. Юниты, созданные по первому шаблону, запускают скрипты по условию ConditionPathExists=|/srv/test/%i/script.sh
. Path-юниты следят за состоянием тех же скриптов через PathChanged
и при изменении дёргают соответствующие сервис-юниты.
Юниты создаются по шаблонам генератором, который читает указанную директорию, присваивает им имена типа test@test01.service
и test@test01.path
и делает симлинки в test.service.wants
.
Сам test.service
просто выполняет /bin/true
и позволяет запускать все сгенерированные юниты скопом (хотя, наверное, стоило бы просто использовать .target
).
Проблема в том, что генератор создаёт юниты только при загрузке системы или перезапуске демона. Если я захочу добавить новую директорию со скриптом, то запускать его уже будет некому.
В документации сказано прямо, что использовать генераторы для динамических конфигураций — плохая идея. В качестве альтернативы предлагается следующее:
If you need to generate dynamic configuration for other services, do so in normal services you order before the service in question.
На этом месте у меня кончается фантазия, а никаких подробностей маны systemd не сообщают.
По идее нужно бы отслеживать директорию на предмет появления новых файлов, но среди проверок пути для path-юнитов, кажется, нет подходящей. Возможно, что здесь требуются и не они. С другой стороны, хотелось бы избежать перезапуска всех остальных скриптов при добавлении нового, но сам этот скрипт запустить.
Буду благодарен, если кто-нибудь натолкнёт на мысль куда копать дальше. Наверняка ведь упускаю из вида что-то существенное.