Can’t open PID file /var/run/nginx.pid (yet?) after start: Too many levels of symbolic links

Зашел на сервер я такой, думаю — обновлю его ( давно не ставил обновы на него). Выполнил апдейт. Захотел кое-что поменят в конфиге с nginx ( менял то, что не должно было поломать веб-сервер). Но после рестарта службы — веб-сервер лег вообще… Обидненько!

PS: Если спросить — чего я автоматом не обновляю пакеты или ОС — та не знаю. Чтобы не лягло все! Это ответ на вопрос ( если у кого-то появится).

Ошибка выглядет так:

(captain-notes)─(✗)─(10:08 PM Wed Apr 29)
└─(/home)─(5 files, 28Kb)─> systemctl status nginx.service
● nginx.service - nginx - high performance web server
   Loaded: loaded (/usr/lib/systemd/system/nginx.service; enabled; vendor preset: disabled)
   Active: activating (start) since Wed 2020-04-29 22:06:39 EEST; 1min 54s ago
     Docs: http://nginx.org/en/docs/
   CGroup: /system.slice/nginx.service
           ├─2197 nginx: master process /usr/sbin/nginx -c /etc/nginx/nginx.conf
           ├─2198 nginx: worker process
           ├─2199 nginx: worker process
           ├─2200 nginx: worker process
           ├─2201 nginx: worker process
           └─2202 nginx: cache manager process

Apr 29 22:06:39 captain-notes systemd[1]: Starting nginx - high performance web server...
Apr 29 22:06:39 captain-notes systemd[1]: Can't open PID file /var/run/nginx.pid (yet?) after start: Too many levels of symbolic links

Приступим к решению!

Can’t open PID file /var/run/nginx.pid (yet?) after start: Too many levels of symbolic links

Приведу пару солюшенов, которые нашел в инете. Перепробовал несколько из них — пофиксил ишью.

Решение №1

Папка /var/run не имеет символической ссылки (symbolic link) для /run директории. Можно проверить это так:

ls -ld /var/run
drwxr-xr-x 12 root root 4096 Apr 29 22:10 /var/run

Так же, папка /run имеется на сервере, проверим:

#  ls -ld /run
drwxr-xr-x 32 root root 980 Apr 29 22:12 /run

Так же, можно грепнуть конфиг nginx:

# grep -ir pid /etc/nginx
/etc/nginx/nginx.conf.default:#pid /var/run/nginx.pid;
/etc/nginx/nginx.conf:#pid /var/run/nginx.pid;

А собственно, решение вот:

# mv /var/run /var/run_orig && ln -s ../run /var/run && ls -ld /var/run

Перезапускаем сервер с nginx и это должно пофиксить проблему.

У меня не решилось… Пробуем другой солюшен….

Решение №2

Смотрим что у нас в конфигах nginx:

# grep -ir pid /etc/nginx
/etc/nginx/nginx.conf:pid        /run/nginx.pid;
/etc/nginx/nginx.conf:#pid /var/run/nginx.pid;

Находим строку:

pid        /var/run/nginx.pid;

И меняем ее на:

pid        /run/nginx.pid;

PS: Можно использовать SED и сделать замену:

# sed -i 's/pid \/var\/run\/nginx.pid/pid \/run\/nginx.pid/' /etc/nginx/nginx.conf

Далее, открываем:

# vim /lib/systemd/system/nginx.service

И меняем строку:

PIDFile=/var/run/nginx.pid

На:

PIDFile=/run/nginx.pid

Чтобы изменения применились, выполняем:

# systemctl daemon-reload

Затем, перезагружаем веб-сервер:

# service nginx restart

В итоге, получаем:

┌(captain-notes)─(✓)─(10:12 PM Wed Apr 29)
└─(/home)─(5 files, 28Kb)─> systemctl status nginx.service
● nginx.service - nginx - high performance web server
   Loaded: loaded (/usr/lib/systemd/system/nginx.service; enabled; vendor preset: disabled)
   Active: active (running) since Wed 2020-04-29 22:12:24 EEST; 10s ago
     Docs: http://nginx.org/en/docs/
  Process: 2996 ExecStart=/usr/sbin/nginx -c /etc/nginx/nginx.conf (code=exited, status=0/SUCCESS)
 Main PID: 2997 (nginx)
   CGroup: /system.slice/nginx.service
           ├─2997 nginx: master process /usr/sbin/nginx -c /etc/nginx/nginx.conf
           ├─2998 nginx: worker process
           ├─2999 nginx: worker process
           ├─3000 nginx: worker process
           ├─3001 nginx: worker process
           ├─3002 nginx: cache manager process
           └─3003 nginx: cache loader process

Apr 29 22:12:24 captain-notes systemd[1]: Starting nginx - high performance web server...
Apr 29 22:12:24 captain-notes systemd[1]: Started nginx - high performance web server.

Я забыл заюзать strace, чтобы отловить ошибку, но нормальное поведение такое:

# strace /run/nginx.pid
execve("/run/nginx.pid", ["/run/nginx.pid"], 0x7ffcaef1ce40 /* 29 vars */) = -1 EACCES (Permission denied)
open("/usr/share/locale/locale.alias", O_RDONLY|O_CLOEXEC) = 3
fstat(3, {st_mode=S_IFREG|0644, st_size=2502, ...}) = 0
mmap(NULL, 4096, PROT_READ|PROT_WRITE, MAP_PRIVATE|MAP_ANONYMOUS, -1, 0) = 0x7f8def0a3000
read(3, "# Locale name alias data base.\n#"..., 4096) = 2502
read(3, "", 4096)                       = 0
close(3)                                = 0
munmap(0x7f8def0a3000, 4096)            = 0
open("/usr/share/locale/en_US.UTF-8/LC_MESSAGES/libc.mo", O_RDONLY) = -1 ENOENT (No such file or directory)
open("/usr/share/locale/en_US.utf8/LC_MESSAGES/libc.mo", O_RDONLY) = -1 ENOENT (No such file or directory)
open("/usr/share/locale/en_US/LC_MESSAGES/libc.mo", O_RDONLY) = -1 ENOENT (No such file or directory)
open("/usr/share/locale/en.UTF-8/LC_MESSAGES/libc.mo", O_RDONLY) = -1 ENOENT (No such file or directory)
open("/usr/share/locale/en.utf8/LC_MESSAGES/libc.mo", O_RDONLY) = -1 ENOENT (No such file or directory)
open("/usr/share/locale/en/LC_MESSAGES/libc.mo", O_RDONLY) = -1 ENOENT (No such file or directory)
fstat(2, {st_mode=S_IFCHR|0620, st_rdev=makedev(136, 0), ...}) = 0
mmap(NULL, 4096, PROT_READ|PROT_WRITE, MAP_PRIVATE|MAP_ANONYMOUS, -1, 0) = 0x7f8def0a3000
write(2, "strace: exec: Permission denied\n", 32strace: exec: Permission denied
) = 32
exit_group(1)                           = ?
+++ exited with 1 +++

ЗАМЕЧАНИЕ! Данная проблема, может касатья не только nginx, но может затронуть mysql или fail2ban и возможно — другие сервисы.

Вот и все, статья «Can’t open PID file /var/run/nginx.pid (yet?) after start: Too many levels of symbolic links» — завершена!

2 thoughts on “Can’t open PID file /var/run/nginx.pid (yet?) after start: Too many levels of symbolic links

  1. в большинстве случае это решается проще:
    sudo chown nginx:nginx /var/run/nginx.pid
    sudo service nginx restart

  2. Чтобы исправить ошибку, нужно поменять владельца файла nginx.pid с root на Nginx

    Выполняю команду chown -R nginx:nginx /run/nginx.pid
    Владелец поменялся, но возвращается обратно root после перезагрузки nginx. Что делать?

Добавить комментарий

Ваш адрес email не будет опубликован. Обязательные поля помечены *

Этот сайт использует Akismet для борьбы со спамом. Узнайте, как обрабатываются ваши данные комментариев.