systemd: PID file /var/run/nginx.pid not readable (yet?) after start.

Gena Makhomed gmm на csdoc.com
Чт Ноя 23 23:12:46 UTC 2017


On 23.11.2017 23:00, Maxim Dounin wrote:

>>> Это всё замечательно (за вычетом того, предлагаемое использование
>>> daemon(3) почему-то не учитывает, что после вызова daemon(3)
>>> parent-процесса уже нет, а "ошибка" - не ошибка), но не отменяет
>>> того, что чуть менее, чем все существующие демоны делают именно
>>> "daemon(); write_pidfile();", и при таком подходе - ситуацию не
>>> изменить.

>> А при каком подходе ситуацию c nginx изменить можно?
>> Если говорить конструктивно.

> Чтобы изменить ситуацию конкретно с nginx - нужно сесть и сделать
> хороший патч.  Очевидно, это сделать можно, и даже не очень
> сложно.  Я, как уже неоднократно сказал, не возражаю.

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

> Но сама идея, что все должны сесть и заняться выпиливанием
> стандартного паттерна, который работал десятки лет, и делать
> вместо это что-то своё с синхронизацией - не взлетит.

Эта идея уже взлетела. Если демон состоит из одного процесса
- systemd может однозначно узнать его pid, проблемы могут возникать
только с теми демонами, которые состоят из нескольких процессов.
Из известных мне сервисов состоящих из более чем одного процесса:

* postfix - сделали синхронизацию и проблем с systemd больше нет.
* httpd - перевели на Type=notify и проблем с systemd больше нет.
* php-fpm - перевели на Type=notify и проблем с systemd больше нет.
* nginx - только с этим сервисом наблюдаются проблемы под systemd.

>> О каких именно "чуть менее, чем все существующие демоны"
>> сервисах Вы говорите? Есть еще кроме nginx примеры некорректного
>> поведения systemd-сервисов с Type=forking которые запускают много
>> дочерних процессов как это делает nginx или postfix?

> Не вижу причин, почему демоны с "много дочерних процессов" должны
> отличаться от сервисов с "мало дочерних процессов".

systemd однозначно определяет pid демонов состоящих из одного процесса
и поэтому для них в юнит-файле можно вообще не указывать опцию PIDFile=
- все будет работать как надо даже если они стартуют без синхронизации.

Вот что говорит Lennart Poettering из Red Hat:

If you use Type=forking, then you'll get away with not specifiying a
PID file in most cases, but it's racy as soon as you have more than
one daemon process, and nginx appears to be one of this kind, hence
please specify PIDFile=.

https://lists.freedesktop.org/archives/systemd-devel/2017-November/039833.html

-- 
Best regards,
  Gena



Подробная информация о списке рассылки nginx-ru