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
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
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średnictwem kill PID
lub 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 nohup
samo słowo kluczowe / polecenie nie pojawia się w danych ps
wyjś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_command
zapisywania wszystkich danych wyjściowych do my.log
(w skrypcie $!
reprezentuje PID ostatniego wykonanego procesu). Jest 2
to deskryptor pliku dla standardowego błędu ( stderr
) i 2>&1
mó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>&1
Jest potrzebne, aby uchwycić żadnych komunikatów o błędach, które zwykle są zapisywane do błędu standardowego do naszego my.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ą:
kill -9 `cat save_pid.txt`
rm save_pid.txt
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 nazwie 1
). 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ścia my.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 na my.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:
ps -ef
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:
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 :)
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
ps -ef
i kill
oba zostały dobrze opisane powyżej, więc jaka jest nowa część?
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}
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
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.
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
.