При входе в Systemd не удается создать файл PID

11

У меня есть вход для системной обработки на пути /etc/systemd/system/systemd-machined.service.d/10-machined-pid-file.conf. когда я бегу, systemctl status systemd-machinedя вижу линии

Drop-In: /etc/systemd/system/systemd-machined.service.d
       └─10-machined-pid-file.conf

Однако я не вижу PID-файл в / var / run /. Который основан на моей вставке:

[Serivce]
PIDFile=/var/run/machined.pid

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

Кристиан Грабовски
источник

Ответы:

18

Параметр PIDFile=не создает файл PID. Это все еще зависит от самой службы, так же, как это было в течение последних 40 лет. Скорее, эта опция сообщает systemd, где найти существующий файл PID (если есть). В большинстве случаев это вообще не требуется, поскольку systemd будет хранить сервисы в своих собственных группах и не будет нуждаться в PID-файле для их отслеживания. Однако systemd удалит PID-файл при выходе из службы, если не удастся выполнить очистку после себя.

Из документации :

Принимает абсолютное имя файла, указывающее на файл PID этого демона. Использование этого параметра рекомендуется для служб, для которых Type=установлено значение forking. systemd прочитает PID основного процесса демона после запуска службы. systemd не будет записывать в файл, настроенный здесь, хотя он удалит файл после завершения службы, если он все еще существует.

Майкл Хэмптон
источник
Спасибо за разъяснение. В моем случае playframework создал файл pid в корневой папке проекта, но остановка или уничтожение этого процесса / службы не удалило файл «pid». Поэтому я не смог перезапустить службу проекта из-за файла "pid". Добавление этой строки «PIDFile = / path / to / pid» в мой файл службы systemd работало нормально. Он удалил файл pid, если служба остановлена ​​или убита
Ikrom
10

К сожалению, systemd не создаст PID-файл для службы без разветвления, даже если вы укажете PIDFile=строку в файле модуля службы. Но вы можете обмануть с помощью ExecStartPost=строки, например:

ExecStartPost=/bin/sh -c 'umask 022; pgrep YOURSERVICE > /var/run/YOURSERVICE.pid'
Майк Глисон
источник