Запуск нескольких служб с разными аргументами

Запуск нескольких служб с разными аргументами

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

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

Я вижу несколько разных способов сделать это:

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

Я мог бы сделать скрипт-обертку на bash или python, который запускает скрипты для источников данных, которые я хочу обработать. Это также кажется немного неуклюжим.

Я мог бы создать один файл модуля для каждого источника данных, каждый из которых вызывал бы скрипт обработки с соответствующими аргументами, это дало бы мне несколько системных файлов, например processing_ds1.system, processing_ds2.system и т. д. Мне это кажется возможным способом, если только нет веской причины не делать этого.

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

Поэтому у меня есть два варианта:

Как можно использовать аргументы с файлами юнитов? Я видел, что postgresql может запускать разные версии с помощью @, т.е.

systemctl start postgres@12-main

для запуска кластера 12-main. Но как это сделать? Я не могу найти ни одного maningful unit-файла для postgresql.

Или

Возможно ли и целесообразно ли запускать несколько служб из одного файла модуля?

решение1

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

Для OpenVPN в качестве примера: вы можете создать файл модуля с именем [email protected]и /etc/systemd/systemследующим содержимым:

[Unit]
Description=OpenVPN connection to %i
After=network-online.target
Wants=network-online.target

[Service]
Type=forking
ExecStart=/usr/sbin/openvpn --config /etc/openvpn/%i.conf
ExecReload=/bin/kill -HUP $MAINPID

[Install]
WantedBy=multi-user.target

Каждый раз, когда вы запускаете systemctl start openvpn@myconfig systemd, он будет заменять %i в файле юнита на "myconfig". Поэтому вы запускаете /usr/sbin/openvpn --config /etc/openvpn/myconfig.conf

Связанный контент