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