Nginx nie zatrzymuje się i brakuje pliku nginx.pid

33

Chcę zatrzymać Nginx, ale tak się nie udaje.

$ sudo service nginx stop
Stopping nginx:                                            [FAILED]

I nginx.confto określa miejsce, w którym nginx.pid ma linię.

# /etc/nginx/nginx.conf
pid        /var/run/nginx.pid;

Ale nie ma nginx.pidtego katalogu /var/run/.

locate nginx.pid pokazuje ten wynik.

/var/run/nginx.pid 
/var/run/nginx.pid.oldbin

Ale po updatedbtym nie ma dopasowania do wyszukiwania. Używam nginx / 1.4.4 w CentOS release 6.5 (Final).

Co powinienem zrobić, aby zatrzymać demona nginx?

Edytuj 2014/01/07

Jest to wyjście ps -ef | grep nginxwydaje nginx demon wciąż działa.

ironsand 17065 16933  0 15:55 pts/0    00:00:00 grep --color nginx
root     19506     1  0  2013 ?        00:00:00 nginx: master process /usr/sbin/nginx -c /etc/nginx/nginx.conf
ironsand 19507 19506  0  2013 ?        00:00:25 nginx: worker process  

I sudo service nginx restartdaje ten błąd. Myślę, że się nginxnie uruchamia, bo stary wciąż żyje. I /var/log/nginx/error.log-2014017zawiera również ten błąd.

Stopping nginx:                                            [FAILED]
Starting nginx: nginx: [emerg] bind() to 0.0.0.0:80 failed (98: Address already in use)
nginx: [emerg] bind() to 0.0.0.0:80 failed (98: Address already in use)
nginx: [emerg] bind() to 0.0.0.0:80 failed (98: Address already in use)
nginx: [emerg] bind() to 0.0.0.0:80 failed (98: Address already in use)
nginx: [emerg] bind() to 0.0.0.0:80 failed (98: Address already in use)
nginx: [emerg] still could not bind()
                                                           [FAILED]
żelazko piaskowe
źródło
3
System nie może zatrzymać nginx, jeśli nie jest uruchomiony, a ponieważ nie ma pliku PID, podejrzewam, że jest już zatrzymany. Możesz to sprawdzić za pomocą ps -ef | grep nginxlub sudo netstat -tlnp | grep nginx.
Ladadadada,
1
Dzięki za radę. Dodałem wynik pspolecenia.
ironsand

Odpowiedzi:

37

Polecę zatrzymać nginx, zabijając najpierw jego główny proces. Nginx nie został poprawnie zamknięty z tego powodu, że nie można go zatrzymać za pomocą skryptu inicjującego.

ps -ef | grep nginx

To pokaże PID głównego procesu nginx. Jak wspomniano powyżej:

root 19506 1 0 2013? 00:00:00 nginx: master process / usr / sbin / nginx -c /etc/nginx/nginx.conf

Zabij to za pomocą

zabij -9 19506

Sprawdź jeszcze raz, czy działa proces nginx lub czy port 80 jest zajęty. Jeśli zauważysz, że jakikolwiek proces jest powiązany z portem 80, Zidentyfikuj PID i sprawdź, czy można go zabić.

ps -ef | grep nginx

netstat -tulpn | grep 80

upewnij się, że system plików jest w porządku i możesz czytać / zapisywać w systemie plików / var. Następnie uruchom nginx

usługa startu Nginx

sandeep.s85
źródło
Dzięki! Po zabiciu głównego procesu musiałem zabić także proces roboczy nginx. Potem mogę wreszcie uruchomić demona nginx.
ironsand
Właśnie uratowałeś duszę Sandeep! Wielkie dzięki za dokumentację ..
Thale
Dzięki @ sandeep.s85. Przydaje mi się również. Co może spowodować brak pliku nginx.pid, gdy nie działa?
Codemonkey
To się właśnie powtórzyło, chciałbym wiedzieć, co to powoduje.
Codemonkey
Mój główny proces nginx powraca do życia po tym, jak go zabiję.
WTIFS
11

Problem

Dla mnie nazwa pliku pid była inna w tych dwóch plikach:

  • /usr/lib/systemd/system/nginx.service
    • pid /var/run/nginx.pid;
  • /etc/nginx/nginx.conf
    • PIDFile=/run/nginx.pid

Tych dwoje musi się zgadzać.

Naprawić:

Więc dostosowałem to w /usr/lib/systemd/system/nginx.service, a następnie:

systemctl daemon-reload
systemctl start nginx

Potem wyszło poprawnie.

Patrick Boos
źródło
3
Dlaczego? W Ubuntu /var/run/znajduje się dowiązanie symboliczne/run/
Z. Zlatev
Tak, to wcale nie jest rozwiązanie. Ale w moim przypadku wszystko to /run/nginx.pid.
niebezpieczne89
Mój plik nginx.conf zawierał dzienniki pid / nginx.pid - zmieniono na /run/nginx.pid i został naprawiony, dzięki Patrick!
phpguru
9

Miałem ten problem, a bieganie ps -ef | grep nginxpokazywałoby mi pracowników, którzy będą się rozkręcać pomimo zabicia głównego procesu, jak sugeruje zaakceptowana odpowiedź:

[~]# ps -ef | grep nginx
nginx    10730     1  0 Sep14 ?        00:00:16 nginx: cache manager process            
nginx    18469     1  0 Oct09 ?        00:11:02 nginx: worker process                   
nginx    25779     1  0 Oct13 ?        00:01:31 nginx: worker process                   
nginx    26458     1  0 15:45 ?        00:00:00 nginx: worker process    

Więc moim rozwiązaniem tego było po prostu:pkill nginx && service nginx restart

amurrell
źródło
1

Mój problem polegał na tym, że pidpodałem w dwóch różnych plikach conf. Po usunięciu jednego odwołania, a następnie usunięciu .pidpliku i ponownym uruchomieniu Nginx, zaczął on zachowywać się normalnie.

Matthewdaniel
źródło
Tak, ten PID jest zdefiniowany w /usr/lib/systemd/system/nginx-debug.service i /etc/nginx/nginx.conf
edmondscommerce
0

To wydaje się wskazywać, że nginx ulega awarii natychmiast, jeśli został uruchomiony wcześniej. Czy sprawdziłeś zawartość, /var/log/nginx*aby zobaczyć, co robi proces?

EDYCJA: Ponadto, jeśli powiesz nam swój system operacyjny i wersję nginx, możemy udzielić bardziej szczegółowych odpowiedzi.

zymhan
źródło
0

Potrzebuję więcej informacji, ale jestem pewien, że masz już inną uruchomiony serwer WWW niż instancję ngnix, którą chcesz, więc musisz ją znaleźć - błąd mówi, że port 80 jest używany, ale nie przez co

Spróbuj netstat -tulpn- szukasz wpisu pod adresem lokalnym, który kończy się na: 80 - poda ci także nazwę programu i PID, abyś mógł go zidentyfikować. Oto moja - korzystam z lighttpd i jest on pokazany w 3. linii.

Active Internet connections (only servers)
Proto Recv-Q Send-Q Local Address           Foreign Address         State       PID/Program name
tcp        0      0 127.0.0.1:5000          0.0.0.0:*               LISTEN      4684/rtorrent
tcp        0      0 127.0.0.1:9000          0.0.0.0:*               LISTEN      923/php-fpm.conf)
tcp        0      0 0.0.0.0:80              0.0.0.0:*               LISTEN      972/lighttpd
tcp        0      0 0.0.0.0:6901            0.0.0.0:*               LISTEN      4684/rtorrent
tcp        0      0 0.0.0.0:22              0.0.0.0:*               LISTEN      720/sshd
tcp6       0      0 :::22                   :::*                    LISTEN      720/sshd
udp        0      0 0.0.0.0:6881            0.0.0.0:*                           4684/rtorrent

Zamknij poprawnie drugi serwer WWW (ponieważ jeśli odradza się na początku, normalne „zabijanie” może nie działać) i spróbuj uruchomić ngnix. W takim przypadku możesz / powinieneś edytować swoje skrypty init, aby zatrzymać uruchomienie innego serwera WWW lub dostosować jego konfigurację na innej mocy.

Journeyman Geek
źródło
Dzięki za pomoc. netstat -tulpnpokazuje tcp 0 0 0.0.0.0:80 0.0.0.0:* LISTEN 19507/nginx. Więc jakoś nginx zajął ten port. Ale jak powiedział sandeep, zabiłem proces Nginx, to działa. Doceniam twoją pomoc!
ironsand
0

Miałem podobny problem z Ubuntu 10.10 i skompilowaną wersją nginx działającą w / opt / nginx / sbin.

sprawdź oba pliki /opt/nginx/conf/nginx.conf i /etc/nginx/nginx.conf i sprawdź, czy pasują do siebie.

Dostosuj plik startowy /etc/init.d/nginx, aby pasował do testu lokalizacji nginx.pid, używając:

sudo /etc/init.d/nginx configtest # should show no failures
sudo /etc/init.d/nginx start      # should show starting
sudo /etc/init.d/nginx status     # should show running
sudo /etc/init.d/nginx stop       # should show stopping -- (wait for a few)
sudo /etc/init.d/nginx status     # should show can not access PID file for nginx
sudo netstat -tap  # should not show nginx program running with open local address
Pete Williams
źródło
0

Aby zatrzymać nginx, sprawdź instrukcję, jak to zrobić man nginx .

Domyślnym sposobem powinno być użycie sygnału stop przy pomocy nginx -s stop .

To naprawdę powinno być takie proste. Twoje opcje to:

stop, quit, reopen, reload.
prosti
źródło