Как получить идентификатор процесса, чтобы убить процесс nohup?

204

Я запускаю процесс nohup на сервере. Когда я пытаюсь убить его, моя консоль замазки закрывается.

вот как я пытаюсь найти идентификатор процесса:

ps -ef |grep nohup 

это команда убить

 kill -9 1787 787
user2535056
источник
6
Вы пытаетесь убить его из скрипта или из командной строки? Вам нужно либо сохранить PID, когда вы сделаете, nohupи использовать его позже для kill, либо найти процесс по имени его команды в ps -efвыходных данных и получить PID из этого. Вы должны искать имя команды, а не nohup.
Люркер
1
@mbratch Вы должны сделать это ответ вместо комментария.
Ансгар Wiechers
@AnsgarWiechers спасибо за предложение. Иногда, если мой ответ очень краткий или я не уверен, что он полностью охватывает то, что просит ОП, я не решаюсь опубликовать его в качестве ответа. Я добавил ответ и включил больше информации.
Люркер

Ответы:

354

Когда nohupвы используете задание в фоновом режиме, оператор фона ( &) выдаст вам PID в командной строке. Если вы планируете вручную управлять процессом, вы можете сохранить этот PID и использовать его позже, чтобы завершить процесс при необходимости, с помощью kill PIDили kill -9 PID(если вам нужно принудительно уничтожить). Кроме того, вы можете найти PID позжеps -ef | grep "command name" и найти PID оттуда. Обратите внимание, что nohupсамо ключевое слово / команда не отображается в psвыходных данных для рассматриваемой команды.

Если бы вы использовали скрипт, вы могли бы сделать что-то вроде:

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

Это запустит my_commandсохранение всего вывода в my.log(в скрипте $!представляет PID последнего выполненного процесса). Это 2дескриптор файла для стандартной ошибки ( stderr) и 2>&1указывает оболочке направить стандартный вывод ошибок на стандартный вывод (дескриптор файла 1). Это требует, &1чтобы оболочка знала, что это дескриптор файла в этом контексте, а не просто файл с именем 1. 2>&1Необходимо , чтобы захватить все сообщения об ошибках , которые обычно записаны на стандартную ошибку в наш my.logфайл (который исходит от стандартного вывода). См. Перенаправление ввода / вывода для получения дополнительной информации об обработке перенаправления ввода / вывода с помощью оболочки.

Если команда отправляет вывод на регулярной основе, вы можете время от времени проверять вывод с помощью tail my.logили, если вы хотите следить за ним, «вживую», который вы можете использовать tail -f my.log. Наконец, если вам нужно убить процесс, вы можете сделать это через:

kill -9 `cat save_pid.txt`
rm save_pid.txt
Lurker
источник
15
Небольшое пояснение, это не nohupсамо по себе, что печатает PID, это финал, &который фоны, например ls &, покажет PID для бегаls
karmakaze
1
Что делает «2> & 1»?
Вирадж
4
@Viraj 2- дескриптор файла «стандартная ошибка». >это перенаправление оболочки, и &1это дескриптор файла «стандартный вывод» ( &здесь необходим, чтобы оболочка не подумала, что я имею в виду файл с именем 1). Таким образом, 2 > &1перенаправляет любой стандартный вывод ошибок на стандартный ввод. Поскольку предыдущий > my.logспособ означает перенаправление стандартного вывода my.log, нам нужен способ гарантировать, что сообщения об ошибках также будут отправляться my.log. 2 > &1гарантирует, что такие ошибки поступают на стандартный вывод, который в свою очередь идет на my.log. См. Перенаправление ввода / вывода .
Люркер
6
echo $!дает мне пид nohup вместо порожденного процесса: paste.fedoraproject.org/428697/99695314
Nehal J Wani
1
@Mvorisek &действует как разделитель команд, поэтому вы можете попробовать sh -c "nohup my_command > my.log 2>&1 & echo $! > save_pid.txt". Это может сработать, но я не пробовал.
Люркер
91

Я использую Red Hat Linux на VPS-сервере (и через SSH - putty), у меня работает следующее:

Сначала вы перечисляете все запущенные процессы:

ps -ef

Затем в первом столбце вы найдете свое имя пользователя; Я нашел это три раза:

  • Одним из них было соединение SSH
  • Вторым было FTP соединение
  • Последний был процессом nohup

Затем во втором столбце вы можете найти PID процесса nohup и набрать только:

kill PID 

(конечно, замена PID на PID процесса nohup)

И это все!

Я надеюсь, что этот ответ будет полезен для кого-то, я также очень плохо знаком с bash и SSH, но нашел 95% знаний, которые мне нужны здесь :)

Телефонная будка
источник
3
Я думаю, что вы имели в виду PID вместо UID здесь?
wprins
Я согласен с @wprins. Убить UID не сработало для меня, но убийство PID сработало.
Райан
В моем случае я запустил сценарий тестовой оболочки (long_running_script.sh) с nohup и & и dint знает, как это остановить. Наконец-то я сделал ps -ef | grep long_running * и поддерживает PID. Затем сделал убийство ПИД
Ренни Джозеф
50

предположим, что я запускаю скрипт ruby ​​в фоновом режиме с помощью команды ниже

nohup ruby script.rb &

тогда я могу получить pid выше фонового процесса, указав имя команды. В моем случае команда - это ruby.

ps -ef | grep ruby

вывод

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

Теперь вы можете легко убить процесс, используя команду kill

kill 25938
Санджай Салунхе
источник
1
Санджай, просто я уверен, что ничего не пропустил, какая часть твоего ответа является новой или отличается от ответов, предоставленных много лет назад? ps -efи killоба были хорошо освещены выше, так что же нового?
Дэвид С. Рэнкин
2
ps -ef выдаст вам длинный список вывода, и поиск по этому длинному списку будет затруднен. так что я думаю ps -ef | grep ruby ​​- лучшая команда для поиска pid, чем просто выполнение ps -ef
Санджай Салунхе
20

jobs -l должен дать вам pid для списка процессов nohup. убить (-9) их осторожно. ;)

Пунит С. Чаухан
источник
11
Только если задание было запущено в текущей оболочке. И kill -9только если вы не знаете, что обычные сигналы не работают.
tripleee
1
Это полезно, если вы находитесь на некотором образе докера, где ps не установлен :-)
Andreas Profous
5

Вы могли бы попробовать

kill -9 `pgrep [command name]`
Balliver
источник
2
очень хорошо! Я использовал, pkill [command name]вы можете использовать -oфлаг для уничтожения самого старого процесса сопоставления, или -nвместо этого использовать самый новый.
Занона
4

Это работает в Ubuntu

Введите это, чтобы узнать PID

ps aux | grep java

Весь запущенный процесс относительно java будет показан

В моем случае это

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

Теперь убей это kill -9 3315

Процесс зомби наконец остановился.

Джон Джо
источник
4

Предположим, что вы выполняете Java-программу с nohup, вы можете получить идентификатор процесса Java с помощью

`ps aux | grep java`

вывод

xxxxx     9643  0.0  0.0  14232   968 pts/2   

тогда вы можете убить процесс, набрав

sudo kill 9643

или скажем, что вам нужно убить все процессы Java, а затем просто использовать

sudo killall java

эта команда убивает все Java-процессоры. Вы можете использовать это с процессом. просто дайте имя процесса в конце команды

sudo killall {processName}
NuOne
источник
2

когда вы создаете задание в nohup, оно сообщит вам идентификатор процесса!

nohup sh test.sh &

вывод покажет вам идентификатор процесса, как

25013

Вы можете убить его тогда:

kill 25013
broid
источник
1

Я запустил сервер django с помощью следующей команды.

nohup manage.py runserver <localhost:port>

Это работает на CentOS:

:~ ns$netstat -ntlp
:~ ns$kill -9 PID 
Насир-Шаик
источник
Это путь к решению process not foundпутаницы с nohup.
CodeSpent
0

Сегодня я встретил ту же проблему. И так как это было давно, я полностью забыл, какую команду я использовал и когда. Я попробовал три метода:

  1. Используя СТИМ, показанный в ps -ef команде. Это показывает время, когда вы запускаете ваш процесс, и очень вероятно, что вы не выполняете команду непосредственно перед закрытием ssh (зависит от вас). К сожалению, я не думаю, что последняя команда - это команда, которую я запускаю с использованием nohup, так что это не работает для меня.
  2. Второй - это PPID, также показанный в ps -efкоманде. Это означает Родительский Идентификатор процесса, идентификатор процесса, который создает процесс. Ppid равен 1 в Ubuntu для процесса, который использует nohup для запуска. Тогда вы можете использоватьps --ppid "1" чтобы получить список, и проверить ВРЕМЯ (общее время ЦП, используемое вашим процессом) или CMD, чтобы найти PID процесса.
  3. Используйте, lsof -i:portесли процесс занимает несколько портов, и вы получите команду. Затем, как и в ответе выше, используйте, ps -ef | grep commandи вы получите PID.

Как только вы найдете PID процесса, вы можете использовать его kill pidдля завершения процесса.

Юность Ву
источник