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

Evgeniy Berdnikov bgx на protva.ru
Чт Ноя 23 19:04:43 UTC 2017


On Wed, Nov 22, 2017 at 08:43:14PM +0300, Maxim Dounin wrote:
> С точки зрения практики - паттерн "daemon(); write_pidfile();" 
> используется чуть менее, чем везде, вплоть до соответствующих 
> библиотечных функций.  Так что инициатива выглядит, скажем так, 
> сомнительной.

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

 1. Папа выполняет pipe(2) и форкает дочку.
 
 2. Дочка читает конфиги, открывает сокеты и делает все нужные
    предварительные проверки, если всё ок -- пишет в пайп
    свой pid и закрывает пайп, если нет -- делает exit().
    
 3. Прочитав пайп, папа видит смотрит, вернулся ли pid или
    eof/ошибка. Если прочитан правильный pid, то он записывается
    в файл, и папа делает exit(0), если нет, то дочка подбирается
    waitpid()ом и её статус выбрасывается через exit() наверх.

 В идеале можно (и я бы сказал нужно) перед чтением пайпа поставить
 на него select() с таймером, чтобы задать максимальное время
 на запуск подпроцесса.

> Проще всего, IMHO, это было бы заткнуть на уровне systemd, 
> дожидаясь появления pid-файла при необходимости.

 Лучше делать не "как проще", а правильно.
-- 
 Eugene Berdnikov


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