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]

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


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.


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


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.


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.


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.


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

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.
Korzystając z naszej strony potwierdzasz, że przeczytałeś(-aś) i rozumiesz nasze zasady używania plików cookie i zasady ochrony prywatności.
Licensed under cc by-sa 3.0 with attribution required.