
Я сделал скрипт на 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