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
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
@mbratch thx jesteś genialny! – user2535056
@mbratch Powinieneś zrobić odpowiedź zamiast komentarza. –