Jak uzyskać identyfikator procesu, aby zabić proces nohup?

204

Na serwerze uruchamiam proces nohup. Gdy próbuję go zabić, konsola szpachli zamyka się.

w ten sposób próbuję znaleźć identyfikator procesu:

ps -ef |grep nohup 

to jest polecenie zabicia

 kill -9 1787 787
użytkownik2535056
źródło
6
Próbujesz zabić go ze skryptu lub z wiersza poleceń? Musisz albo zapisać PID, kiedy to robisz nohupi użyć go później dla kill, albo znaleźć proces według jego nazwy polecenia na ps -efwyjściu i uzyskać PID z tego. Musisz poszukać nazwy polecenia nohup.
lurker
1
@mbratch Powinieneś udzielić odpowiedzi zamiast komentarza.
Ansgar Wiechers
@AnsgarWiechers dzięki za sugestię. Czasami, jeśli moja odpowiedź jest bardzo krótka lub nie jestem pewien, czy całkowicie pokrywa to, o co prosi OP, waham się, czy opublikować ją jako odpowiedź. Dodałem odpowiedź i podałem więcej informacji.
lurker

Odpowiedzi:

353

Podczas używania nohupi umieszczania zadania w tle operator w tle ( &) podaje identyfikator 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 w razie potrzeby za pośrednictwem kill PIDlub kill -9 PID(jeśli musisz wymusić zabicie). Alternatywnie, możesz później znaleźć PID ps -ef | grep "command name"i zlokalizować PID stamtąd. Zauważ, że nohupsamo słowo kluczowe / polecenie nie pojawia się w danych pswyjściowych dla danego polecenia.

Jeśli użyłeś skryptu, możesz zrobić coś takiego:

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

Spowoduje to uruchomienie my_commandzapisywania wszystkich danych wyjściowych do my.log(w skrypcie $!reprezentuje PID ostatniego wykonanego procesu). Jest 2to deskryptor pliku dla standardowego błędu ( stderr) i 2>&1mówi powłoce, aby skierowała standardowe wyjście błędu do standardowego wyjścia (deskryptor pliku 1). To wymaga&1 to, aby powłoka wiedziała, że ​​jest to deskryptor pliku w tym kontekście, a nie tylko plik o nazwie 1. 2>&1Jest potrzebne, aby uchwycić żadnych komunikatów o błędach, które zwykle są zapisywane do błędu standardowego do naszego my.logpliku (który pochodzi z standardowe wyjście). Zobacz Przekierowanie we / wy, aby uzyskać więcej informacji na temat obsługi przekierowania we / wy za pomocą powłoki.

Jeśli polecenie wysyła dane wyjściowe regularnie, możesz od czasu do czasu sprawdzić dane wyjściowe za pomocą tail my.loglub, jeśli chcesz śledzić dane wyjściowe „na żywo”, możesz użyć tail -f my.log. Wreszcie, jeśli musisz zabić proces, możesz to zrobić za pomocą:

kill -9 `cat save_pid.txt`
rm save_pid.txt
czai się
źródło
15
Lekkie wyjaśnienie, to nie jest samo w nohupsobie, które drukuje PID, jest to ostateczne &tło, które np. ls &Pokazuje PID do bieganials
karmakaze
1
Do czego służą „2> i 1”?
Viraj,
4
@Viraj 2to deskryptor pliku „standard error”. >jest przekierowaniem powłoki i &1jest deskryptorem pliku „standardowego wyjścia” ( &jest tutaj potrzebny, aby powłoka nie myślała, że ​​mam na myśli plik o nazwie 1). 2 > &1Przekierowuje więc standardowe wyjście błędów na standardowe wejście. Ponieważ wcześniejszym > my.logsposobem było przekierowanie standardowego wyjścia my.log, potrzebujemy sposobu, aby upewnić się, że komunikaty o błędach również trafiają my.log. 2 > &1zapewnia, że ​​takie błędy trafiają na standardowe wyjście, które z kolei trafia na my.log. Zobacz Przekierowanie we / wy .
lurker
6
echo $!daje mi pid nohup zamiast spawnowanego
Nehal J Wani
1
@Mvorisek &działa jako ogranicznik poleceń, więc można spróbować sh -c "nohup my_command > my.log 2>&1 & echo $! > save_pid.txt". To może działać, ale nie próbowałem.
lurker
91

Używam linux red hat na serwerze VPS (i przez SSH - kit), dla mnie działało:

Najpierw wymień wszystkie uruchomione procesy:

ps -ef

Następnie w pierwszej kolumnie znajdziesz swoją nazwę użytkownika; Znalazłem to trzy razy:

  • Jednym z nich było połączenie SSH
  • Drugim było połączenie FTP
  • Ostatnim był proces nohup

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

kill PID 

(oczywiście zastępując PID PID procesu nohup)

I to jest to!

Mam nadzieję, że ta odpowiedź będzie przydatna dla kogoś, kogo też jestem nowy w bash i SSH, ale znalazłem 95% wiedzy, której potrzebuję tutaj :)

Budka telefoniczna
źródło
3
Myślę, że miałeś na myśli PID zamiast UID?
wprins
Zgadzam się z @wprins. Zabicie UID nie działało dla mnie, ale zabiło PID.
Ryan
W moim przypadku uruchomiłem skrypt powłoki testowej (long_running_script.sh) z nohup i & i nie wiem, jak go zatrzymać. W końcu zrobiłem ps -ef | grep long_running * i fouund the PID. Potem zabił PID
Rennish Joseph
50

przypuśćmy, że uruchamiam skrypt ruby ​​w tle za pomocą polecenia poniżej

nohup ruby script.rb &

następnie mogę uzyskać pid powyższego procesu w tle, podając nazwę polecenia. W moim przypadku polecenie jest rubinowe.

ps -ef | grep ruby

wynik

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

Teraz możesz łatwo zabić proces za pomocą polecenia kill

kill 25938
Sanjay Salunkhe
źródło
1
Sanjay, jestem pewien, że niczego mi nie brakuje, jaka część twojej odpowiedzi jest nowa lub inna niż odpowiedzi udzielone przed laty? ps -efi killoba zostały dobrze opisane powyżej, więc jaka jest nowa część?
David C. Rankin
2
ps -ef poda 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 do wyszukiwania pid niż tylko wykonywanie ps -ef
Sanjay Salunkhe
20

zadania -l powinny dać ci pid dla listy procesów nohup. zabij ich (-9) delikatnie. ;)

Puneet S. Chauhan
źródło
11
Tylko jeśli zadanie zostało uruchomione w bieżącej powłoce. I nie, kill -9chyba że wiesz, że zwykłe sygnały nie działają.
tripleee
1
Jest to przydatne, jeśli jesteś na jakimś obrazie
dokera,
5

Możesz spróbować

kill -9 `pgrep [command name]`
Balliver
źródło
2
bardzo dobrze! Użyłem, pkill [command name]że możesz użyć -oflagi do zabicia najstarszego procesu dopasowywania lub -nzamiast tego użyć najnowszego.
zanona
4

To działa w Ubuntu

Wpisz to, aby dowiedzieć się PID

ps aux | grep java

Pokaże się cały proces związany z Javą

W moim przypadku jest

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

Teraz zabij to kill -9 3315

Proces zombie w końcu zatrzymał się.

John Joe
źródło
4

Załóżmy, że uruchamiasz program Java bez narzędzia, za pomocą którego możesz uzyskać identyfikator procesu Java

`ps aux | grep java`

wynik

xxxxx     9643  0.0  0.0  14232   968 pts/2   

następnie możesz zabić proces, pisząc

sudo kill 9643

lub powiedzmy, że musisz zabić wszystkie procesy Java, a następnie po prostu użyj

sudo killall java

to polecenie zabija wszystkie procesory Java. możesz użyć tego z procesem. po prostu podaj nazwę procesu na końcu polecenia

sudo killall {processName}
NuOne
źródło
2

kiedy utworzysz zadanie w trybie „nohup”, poda ci identyfikator procesu!

nohup sh test.sh &

dane wyjściowe pokażą identyfikator procesu jak

25013

możesz to następnie zabić:

kill 25013
broid
źródło
1

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

nohup manage.py runserver <localhost:port>

Działa to na CentOS:

:~ ns$netstat -ntlp
:~ ns$kill -9 PID 
Naseer-shaik
źródło
To jest droga do rozwiązania problemu process not foundz nohup.
CodeSpent
0

Dzisiaj spotkałem ten sam problem. A ponieważ to było dawno temu, całkowicie zapomniałem, którego polecenia użyłem i kiedy. Wypróbowałem trzy metody:

  1. Korzystanie ze STIME pokazanego w ps -ef poleceniu. Pokazuje czas rozpoczęcia procesu i jest bardzo prawdopodobne, że nic nie dowodzisz tuż przed zamknięciem ssh (zależy od ciebie). Niestety nie sądzę, że najnowszym poleceniem jest polecenie, które uruchamiam za pomocą nohup, więc to nie działa dla mnie.
  2. Drugi to PPID, również pokazany w ps -efpoleceniu. Oznacza nadrzędny identyfikator procesu, identyfikator procesu, który tworzy proces. PPID ma 1 w Ubuntu dla procesu używającego nohup do uruchomienia. Następnie możesz użyć, ps --ppid "1"aby uzyskać listę i sprawdzić CZAS (całkowity czas pracy procesora w procesie) lub CMD, aby znaleźć PID procesu.
  3. Użyj, lsof -i:portjeśli proces zajmie niektóre porty, a otrzymasz polecenie. Następnie, podobnie jak powyższa odpowiedź, użyj, ps -ef | grep commanda otrzymasz PID.

Gdy znajdziesz PID procesu, możesz go użyć kill piddo zakończenia procesu.

Youth Wu
źródło