Там столько всего неправильного.
- Не рассматривайте
ExecStart
и ExecStop
как командные строки оболочки. Они не. Руководство systemd предупреждает об этом. Расширения оболочки, такие как подстановка команд, недоступны в этих настройках файла сервисного модуля. Это , а не язык оболочки. - Не создавайте файловый механизм PID, если место, с которого вы начинаете, имеет под рукой фактический диспетчер служб. Файлы PID — это механизм, о котором мы знаем, что он сломан с 1980-х годов, и что надлежащее управление службами полностью избавляет от необходимости. У вас есть сервис-менеджер. Это гарантирует, что в любой момент времени будет запущен не более одного экземпляра службы. Он будет отслеживать идентификатор процесса. Он будет иметь дело с отправкой сигналов завершения в процесс службы, когда служба закрывается.
- Не включайте в серверный процесс базовые -элементы серверной стороны, такие как создание FIFO и открытие его серверной части.
Делай так:
- Создайте блок розеток, который будет располагаться рядом с сервисным блоком.
- Убрать всю явную обработку FIFO из
crashCollector
. - Используйте
ListenFIFO
в гнездовом блоке. Конечно, для этого потребуется абсолютный путь. - Используйте
StandardInput=socket
в сервисном блоке. - Сделайте так, чтобы ваш
crashcollector
скрипт просто читал со стандартного ввода. - Извлеките весь файл PID из
crashCollector
. - Удалите все перехваты сигналов и
cleanup()
прочее из crashCollector
. - Исключите все явные убийства с помощью
ExecStop
и последующую махинацию, которую вы пытались совершить с помощью KillMode
, из служебного подразделения. - Используйте
StandardError=journal
в сервисном блоке. - Замените
log
простым echo 1>&2
на стандартную ошибку.
Дополнительная литература
JdeBP
28.01.2020, 05:16
Ссылка