LINUX.ORG.RU
решено ФорумAdmin

nginx.service: Can't open PID file /run/nginx.pid (yet?) after start: Bad file descriptor

 ,


0

1

Archlinux, после старта nginx появляется такая ошибка в логе.

May 08 15:10:55 alpine systemd[1]: Starting A high performance web server and a reverse proxy server...
May 08 15:10:56 alpine systemd[1]: nginx.service: Can't open PID file /run/nginx.pid (yet?) after start: Bad file descriptor
May 08 15:10:56 alpine systemd[1]: Started A high performance web server and a reverse proxy server.

systemd юнит:

# systemctl cat nginx
# /usr/lib/systemd/system/nginx.service
[Unit]
Description=A high performance web server and a reverse proxy server
After=network.target network-online.target nss-lookup.target

[Service]
Type=forking
PIDFile=/run/nginx.pid
PrivateDevices=yes
SyslogLevel=err

ExecStart=/usr/bin/nginx -g 'pid /run/nginx.pid; error_log stderr;'
ExecReload=/usr/bin/nginx -s reload
KillMode=mixed

[Install]
WantedBy=multi-user.target

В nginx.conf ничего, относящегося к делу нет.

Файл /run/nginx.pid создаётся, pid в нём присутствует.

Почитал man open, пишут, что

EBADF
(openat()) pathname is relative but dirfd is neither AT_FDCWD nor a valid file descriptor.

и совсем запутался. В исходниках systemd не осилил понять, что происходит, тут и тут если кому интересно.

Версия systemd 253.4-1-arch.

Так в принципе оно вроде работает, но это же неправильно.

/run это tmpfs, никаких симлинков вроде нигде не задействовано.

Перемещено hobbit из general

★★★★★

Последнее исправление: vbr (всего исправлений: 1)

Так в принципе оно вроде работает, но это же неправильно.

Это общий принцип systemd. Надо от него (от systemd) избавляться.

А конкретно в указанном тобой коде явный баг, формат %m смотрит errno, а функция chase_symlinks его не заполняет (ну или не всегда заполняет, по крайней мере, например она может вернуть '-EINVAL' в переменную r а errno останется какой-то какой был до этого).

Очевидно, это не единственный баг там, ведь из-за него лишь показывается не то сообщение об ошибке которое он хотел.

firkax ★★★★★
()
Последнее исправление: firkax (всего исправлений: 4)
Ответ на: комментарий от firkax

Они передают fd параметром error в функцию логгирования. fd инициализируется значением EBADF. Потом перед форматированием ошибки они делают errno = error. Отсюда и берётся это сообщение об ошибке. В общем оно бесполезно и про источник ошибки ничего не говорит, говорит лишь, что chase не меняла *fd.

vbr ★★★★★
() автор топика
Последнее исправление: vbr (всего исправлений: 2)

В общем пока убрал эту опцию вообще, раз systemd её и так не видит, хуже не будет. По крайней мере не ругается.

cat /etc/systemd/system/nginx.service.d/override.conf 
[Service]
PIDFile=

У меня предположение, что nginx создаёт PID файл внутри форкнутого процесса, а systemd его проверяет сразу после завершения главного процесса. В итоге получается гонка. Тогда тут systemd не при чём. Но я не знаю, как проверить это предположение.

PS: походу я прав: https://trac.nginx.org/nginx/ticket/1897

И интересное чтиво для развлечения: https://mailman.nginx.org/pipermail/nginx-ru/2017-November/060604.html

vbr ★★★★★
() автор топика
Последнее исправление: vbr (всего исправлений: 4)

Я бы первым делом файл тот удалил, а затем тему создавал, если не помогло… Но там просто какая-то ошибка с кривыми руками https://askubuntu.com/questions/1113319/nginx-service-cant-open-pid-file-run-nginx и такое https://devsday.ru/blog/details/17118

Конфиги переписали, а при обновлении пакета старые конфиги не заменяются. Я вообще все эти нгинксы запускаю из докера. Проще когда тебе нужно что-то развернуть docker-compose up -d сделать в нужном каталоге, а потом всю эту муру убить, мне не по нраву чтобы какие-то сервера, базы крутятся постоянно и насилуют SSD, сбрасывая свой кеш. Особенно MongoDB - это убийца SSD!

uwuwuu
()
Последнее исправление: uwuwuu (всего исправлений: 1)
21 мая 2024 г.
Ответ на: комментарий от vbr

Обновил nginx c 1.18 до 1.26 и столкнулся с проблемой (nginx.service: Can’t open PID file /run/nginx.pid (yet?) after start: Operation not permitted)

Ваше решение решило проблему. Правда допысал тут: /lib/systemd/system/nginx.service [Service] Type=forking #PIDFile=/var/run/nginx.pid PIDFile=/run/nginx.pid

ExecStart=/usr/sbin/nginx -c /etc/nginx/nginx.conf ExecReload=/bin/sh -c «/bin/kill -s HUP $(/bin/cat /var/run/nginx.pid)» ExecStop=/bin/sh -c «/bin/kill -s TERM $(/bin/cat /var/run/nginx.pid)» ExecStartPost=/bin/sleep 1 [Install] WantedBy=multi-user.target

shinta111
()