2013-06-29 23 views
125

Uruchomiłem proces nohup na serwerze. Kiedy próbuję go zabić, zamiast tego zamyka się moja konsola.Jak uzyskać identyfikator procesu, aby zabić proces nohup?

ten sposób staram się znaleźć identyfikator procesu:

ps -ef |grep nohup 

to jest polecenie, aby zabić

kill -9 1787 787 
+6

Czy próbujesz zabić go ze skryptu lub w wierszu polecenia? Musisz albo zapisać PID, kiedy wykonujesz 'nohup' i użyć go później dla' kill', albo znaleźć proces poprzez jego nazwę polecenia w wyjściu 'ps -ef' i otrzymać PID z tego. Musisz szukać nazwy polecenia, a nie 'nohup'. – lurker

+0

@mbratch thx jesteś genialny! – user2535056

+0

@mbratch Powinieneś zrobić odpowiedź zamiast komentarza. –

Odpowiedz

203

Podczas korzystania nohup i umieścić zadania w tle, operator tła (&) da ci PID w wierszu polecenia. Jeśli Twoim planem jest ręczne zarządzanie procesem, możesz zapisać ten PID i użyć go później, aby zabić proces, jeśli to konieczne, poprzez kill PID lub kill -9 PID (jeśli chcesz wymusić zabicie). Alternatywnie możesz później znaleźć PID pod numerem ps -ef | grep "command name" i od tego miejsca zlokalizować PID. Uwaga: samo słowo kluczowe/polecenie nie pojawia się na wyjściu ps dla danego polecenia.

Jeśli używany skrypt, można zrobić coś takiego:

nohup my_command > my.log 2>&1 & 
echo $! > save_pid.txt 

Spowoduje to uruchomienie my_command zapisywania wszystkie dane wyjściowe do my.log (w skrypcie, $! reprezentuje PID ostatniego procesu wykonywany). 2 jest deskryptorem pliku dla błędu standardowego (stderr), a 2>&1 mówi powłoce, aby skierowała standardowe wyjście błędów do standardowego wyjścia (deskryptor pliku 1). Wymaga ona &1, aby powłoka wiedziała, że ​​jest to deskryptor pliku w tym kontekście, a nie tylko plik o nazwie 1. Numer 2>&1 jest potrzebny do przechwycenia wszystkich komunikatów o błędach, które normalnie są zapisywane w standardowym błędzie w naszym pliku my.log (który pochodzi ze standardowego wyjścia). Zobacz I/O Redirection, aby uzyskać więcej informacji na temat obsługi przekierowania we/wy z powłoką.

Jeśli polecenie wysyła dane wyjściowe w sposób regularny, można od czasu do czasu sprawdzić dane wyjściowe za pomocą tail my.log, lub jeśli chcesz śledzić je "na żywo", możesz użyć tail -f my.log.W końcu, jeśli trzeba zabić proces, można to zrobić poprzez:

kill -9 `cat save_pid.txt` 
rm save_pid.txt 
+8

Drobne wyjaśnienie, to nie 'nohup' per se, który wypisuje PID, to ostatnie' i 'które to tło, np. 'ls &' pokazuje PID do uruchamiania 'ls' – karmakaze

+0

@karmakaze tak, naprawdę, dzięki za wyjaśnienie! – lurker

+1

Co robią "2> i 1"? – Viraj

47

Używam Red Hat Linux na serwerze VPS (i poprzez SSH - putty), dla mnie następujące pracował:

po pierwsze, należy wymienić wszystkie procesy uruchomione:

ps -ef 

Następnie w pierwszej kolumnie znajdziesz swoją nazwę użytkownika; I okazało się, że następujące trzy razy:

  • Jednym z nich był ssh
  • Drugi był Połączenie FTP
  • Ten ostatni był proces nohup

Następnie w drugiej kolumnie ty może znaleźć PID procesu nohup i wpisujesz tylko:

kill PID 

(zastępując PID procesem nohup ss's PID oczywiście)

I to jest to!

Mam nadzieję, że odpowiedź będzie przydatna dla kogoś, jestem również bardzo nowe do bash i SSH, ale okazało się, 95% wiedzy muszę tutaj :)

+1

Myślę, że miałeś na myśli PID zamiast UID? – wprins

+0

Zgadzam się z @wprins. Zabicie UIDa nie zadziałało, ale zabicie PID. – Ryan

4

można spróbować

kill -9 `pgrep [command name]` 
+0

bardzo ładne! Użyłem 'pkill [nazwa polecenia]' możesz użyć flagi '-o' do zabicia najstarszego pasującego procesu lub' -n' aby użyć najnowszego. – zanona

24

Przypuszczam Używam skrypt ruby ​​w tle z poniższej komendy

nohup ruby script.rb & 

wtedy mogę dostać PID powyżej proces w tle, podając nazwę polecenia. W moim przypadku komenda jest ruby.

ps -ef | grep ruby 

wyjście

ubuntu 25938 25742 0 05:16 pts/0 00:00:00 ruby test.rb 

Teraz można łatwo zabić proces przy użyciu polecenia kill

kill 25938 
+1

Sanjay, więc jestem pewien, że niczego nie brakuje, jaka część twojej odpowiedzi jest nowa lub inna niż odpowiedzi udzielone lata temu? 'ps -ef' i' kill' zostały dobrze opisane powyżej, więc jaka jest nowa część? –

+2

ps -ef da ci długą listę wyników, a wyszukiwanie z tej długiej listy będzie trudne. więc myślę, że ps -ef | grep ruby ​​jest lepszym poleceniem wyszukiwania pid niż po prostu ps -ef –

10

pracy -l powinno dać wam PID dla listy procesów nohup. zabij (-9) delikatnie. ;)

+3

Tylko jeśli zadanie zostało uruchomione w bieżącej powłoce. I nie "zabijaj -9", chyba że wiesz, że regularne sygnały nie działają. – tripleee

1

Działa to w Ubuntu

Type to, aby dowiedzieć się PID

ps aux | grep java 

cały proces docierania dotyczące Java będzie udostępniana

W moim przypadku jest

johnjoe  3315 9.1 4.0 1465240 335728 ?  Sl 09:42 3:19 java -jar batch.jar 

Teraz zabij i t kill -9 3315

Proces zombie w końcu ustał.

1

Uruchomiłem serwer django za pomocą następującego polecenia.

nohup manage.py runserver <localhost:port> 

To działa na CentOS:

:~ ns$netstat -ntlp 
:~ ns$kill -9 PID 
Powiązane problemy