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.
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ą:
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 .
@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 :)
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.
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. ;)
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:
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.
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.
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.
nohup
i użyć go później dlakill
, albo znaleźć proces według jego nazwy polecenia naps -ef
wyjściu i uzyskać PID z tego. Musisz poszukać nazwy polecenianohup
.Odpowiedzi:
Podczas używania
nohup
i 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średnictwemkill PID
lubkill -9 PID
(jeśli musisz wymusić zabicie). Alternatywnie, możesz później znaleźć PIDps -ef | grep "command name"
i zlokalizować PID stamtąd. Zauważ, żenohup
samo słowo kluczowe / polecenie nie pojawia się w danychps
wyjściowych dla danego polecenia.Jeśli użyłeś skryptu, możesz zrobić coś takiego:
Spowoduje to uruchomienie
my_command
zapisywania wszystkich danych wyjściowych domy.log
(w skrypcie$!
reprezentuje PID ostatniego wykonanego procesu). Jest2
to deskryptor pliku dla standardowego błędu (stderr
) i2>&1
mówi powłoce, aby skierowała standardowe wyjście błędu do standardowego wyjścia (deskryptor pliku1
). To wymaga&1
to, aby powłoka wiedziała, że jest to deskryptor pliku w tym kontekście, a nie tylko plik o nazwie1
.2>&1
Jest potrzebne, aby uchwycić żadnych komunikatów o błędach, które zwykle są zapisywane do błędu standardowego do naszegomy.log
pliku (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.log
lub, 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ą:źródło
nohup
sobie, które drukuje PID, jest to ostateczne&
tło, które np.ls &
Pokazuje PID do bieganials
2
to deskryptor pliku „standard error”.>
jest przekierowaniem powłoki i&1
jest deskryptorem pliku „standardowego wyjścia” (&
jest tutaj potrzebny, aby powłoka nie myślała, że mam na myśli plik o nazwie1
).2 > &1
Przekierowuje więc standardowe wyjście błędów na standardowe wejście. Ponieważ wcześniejszym> my.log
sposobem było przekierowanie standardowego wyjściamy.log
, potrzebujemy sposobu, aby upewnić się, że komunikaty o błędach również trafiająmy.log
.2 > &1
zapewnia, że takie błędy trafiają na standardowe wyjście, które z kolei trafia namy.log
. Zobacz Przekierowanie we / wy .echo $!
daje mi pid nohup zamiast spawnowanego&
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.Używam linux red hat na serwerze VPS (i przez SSH - kit), dla mnie działało:
Najpierw wymień wszystkie uruchomione procesy:
Następnie w pierwszej kolumnie znajdziesz swoją nazwę użytkownika; Znalazłem to trzy razy:
Następnie w drugiej kolumnie możesz znaleźć PID procesu nohup i wpisujesz tylko:
(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 :)
źródło
przypuśćmy, że uruchamiam skrypt ruby w tle za pomocą polecenia poniżej
następnie mogę uzyskać pid powyższego procesu w tle, podając nazwę polecenia. W moim przypadku polecenie jest rubinowe.
wynik
Teraz możesz łatwo zabić proces za pomocą polecenia kill
źródło
ps -ef
ikill
oba zostały dobrze opisane powyżej, więc jaka jest nowa część?zadania -l powinny dać ci pid dla listy procesów nohup. zabij ich (-9) delikatnie. ;)
źródło
kill -9
chyba że wiesz, że zwykłe sygnały nie działają.Możesz spróbować
źródło
pkill [command name]
że możesz użyć-o
flagi do zabicia najstarszego procesu dopasowywania lub-n
zamiast tego użyć najnowszego.To działa w
Ubuntu
Wpisz to, aby dowiedzieć się
PID
Pokaże się cały proces związany z Javą
W moim przypadku jest
Teraz zabij to
kill -9 3315
Proces zombie w końcu zatrzymał się.
źródło
Załóżmy, że uruchamiasz program Java bez narzędzia, za pomocą którego możesz uzyskać identyfikator procesu Java
wynik
następnie możesz zabić proces, pisząc
lub powiedzmy, że musisz zabić wszystkie procesy Java, a następnie po prostu użyj
to polecenie zabija wszystkie procesory Java. możesz użyć tego z procesem. po prostu podaj nazwę procesu na końcu polecenia
źródło
kiedy utworzysz zadanie w trybie „nohup”, poda ci identyfikator procesu!
dane wyjściowe pokażą identyfikator procesu jak
możesz to następnie zabić:
źródło
Uruchomiłem serwer django za pomocą następującego polecenia.
Działa to na CentOS:
źródło
process not found
z nohup.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:
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.ps -ef
poleceniu. 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.lsof -i:port
jeśli proces zajmie niektóre porty, a otrzymasz polecenie. Następnie, podobnie jak powyższa odpowiedź, użyj,ps -ef | grep command
a otrzymasz PID.Gdy znajdziesz PID procesu, możesz go użyć
kill pid
do zakończenia procesu.źródło