Вы пытаетесь убить его из скрипта или из командной строки? Вам нужно либо сохранить 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выходных данных для рассматриваемой команды.
Если бы вы использовали скрипт, вы могли бы сделать что-то вроде:
Это запустит my_commandсохранение всего вывода в my.log(в скрипте $!представляет PID последнего выполненного процесса). Это 2дескриптор файла для стандартной ошибки ( stderr) и 2>&1указывает оболочке направить стандартный вывод ошибок на стандартный вывод (дескриптор файла 1). Это требует, &1чтобы оболочка знала, что это дескриптор файла в этом контексте, а не просто файл с именем 1. 2>&1Необходимо , чтобы захватить все сообщения об ошибках , которые обычно записаны на стандартную ошибку в наш my.logфайл (который исходит от стандартного вывода). См. Перенаправление ввода / вывода для получения дополнительной информации об обработке перенаправления ввода / вывода с помощью оболочки.
Если команда отправляет вывод на регулярной основе, вы можете время от времени проверять вывод с помощью tail my.logили, если вы хотите следить за ним, «вживую», который вы можете использовать tail -f my.log. Наконец, если вам нужно убить процесс, вы можете сделать это через:
Небольшое пояснение, это не 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. См. Перенаправление ввода / вывода .
@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% знаний, которые мне нужны здесь :)
Я думаю, что вы имели в виду 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и killоба были хорошо освещены выше, так что же нового?
Дэвид С. Рэнкин
2
ps -ef выдаст вам длинный список вывода, и поиск по этому длинному списку будет затруднен. так что я думаю ps -ef | grep ruby - лучшая команда для поиска pid, чем просто выполнение ps -ef
Санджай Салунхе
20
jobs -l должен дать вам pid для списка процессов nohup. убить (-9) их осторожно. ;)
очень хорошо! Я использовал, pkill [command name]вы можете использовать -oфлаг для уничтожения самого старого процесса сопоставления, или -nвместо этого использовать самый новый.
Занона
4
Это работает в Ubuntu
Введите это, чтобы узнать PID
ps aux | grep java
Весь запущенный процесс относительно java будет показан
Это путь к решению process not foundпутаницы с nohup.
CodeSpent
0
Сегодня я встретил ту же проблему. И так как это было давно, я полностью забыл, какую команду я использовал и когда. Я попробовал три метода:
Используя СТИМ, показанный в ps -ef команде. Это показывает время, когда вы запускаете ваш процесс, и очень вероятно, что вы не выполняете команду непосредственно перед закрытием ssh (зависит от вас). К сожалению, я не думаю, что последняя команда - это команда, которую я запускаю с использованием nohup, так что это не работает для меня.
Второй - это PPID, также показанный в ps -efкоманде. Это означает Родительский Идентификатор процесса, идентификатор процесса, который создает процесс. Ppid равен 1 в Ubuntu для процесса, который использует nohup для запуска. Тогда вы можете использоватьps --ppid "1" чтобы получить список, и проверить ВРЕМЯ (общее время ЦП, используемое вашим процессом) или CMD, чтобы найти PID процесса.
Используйте, lsof -i:portесли процесс занимает несколько портов, и вы получите команду. Затем, как и в ответе выше, используйте, ps -ef | grep commandи вы получите PID.
Как только вы найдете PID процесса, вы можете использовать его kill pidдля завершения процесса.
nohup
и использовать его позже дляkill
, либо найти процесс по имени его команды вps -ef
выходных данных и получить PID из этого. Вы должны искать имя команды, а неnohup
.Ответы:
Когда
nohup
вы используете задание в фоновом режиме, оператор фона (&
) выдаст вам PID в командной строке. Если вы планируете вручную управлять процессом, вы можете сохранить этот PID и использовать его позже, чтобы завершить процесс при необходимости, с помощьюkill PID
илиkill -9 PID
(если вам нужно принудительно уничтожить). Кроме того, вы можете найти PID позжеps -ef | grep "command name"
и найти PID оттуда. Обратите внимание, чтоnohup
само ключевое слово / команда не отображается вps
выходных данных для рассматриваемой команды.Если бы вы использовали скрипт, вы могли бы сделать что-то вроде:
Это запустит
my_command
сохранение всего вывода вmy.log
(в скрипте$!
представляет PID последнего выполненного процесса). Это2
дескриптор файла для стандартной ошибки (stderr
) и2>&1
указывает оболочке направить стандартный вывод ошибок на стандартный вывод (дескриптор файла1
). Это требует,&1
чтобы оболочка знала, что это дескриптор файла в этом контексте, а не просто файл с именем1
.2>&1
Необходимо , чтобы захватить все сообщения об ошибках , которые обычно записаны на стандартную ошибку в нашmy.log
файл (который исходит от стандартного вывода). См. Перенаправление ввода / вывода для получения дополнительной информации об обработке перенаправления ввода / вывода с помощью оболочки.Если команда отправляет вывод на регулярной основе, вы можете время от времени проверять вывод с помощью
tail my.log
или, если вы хотите следить за ним, «вживую», который вы можете использоватьtail -f my.log
. Наконец, если вам нужно убить процесс, вы можете сделать это через:источник
nohup
само по себе, что печатает PID, это финал,&
который фоны, напримерls &
, покажет PID для бегаls
2
- дескриптор файла «стандартная ошибка».>
это перенаправление оболочки, и&1
это дескриптор файла «стандартный вывод» (&
здесь необходим, чтобы оболочка не подумала, что я имею в виду файл с именем1
). Таким образом,2 > &1
перенаправляет любой стандартный вывод ошибок на стандартный ввод. Поскольку предыдущий> my.log
способ означает перенаправление стандартного выводаmy.log
, нам нужен способ гарантировать, что сообщения об ошибках также будут отправлятьсяmy.log
.2 > &1
гарантирует, что такие ошибки поступают на стандартный вывод, который в свою очередь идет наmy.log
. См. Перенаправление ввода / вывода .echo $!
дает мне пид nohup вместо порожденного процесса: paste.fedoraproject.org/428697/99695314&
действует как разделитель команд, поэтому вы можете попробоватьsh -c "nohup my_command > my.log 2>&1 & echo $! > save_pid.txt"
. Это может сработать, но я не пробовал.Я использую Red Hat Linux на VPS-сервере (и через SSH - putty), у меня работает следующее:
Сначала вы перечисляете все запущенные процессы:
Затем в первом столбце вы найдете свое имя пользователя; Я нашел это три раза:
Затем во втором столбце вы можете найти PID процесса nohup и набрать только:
(конечно, замена PID на PID процесса nohup)
И это все!
Я надеюсь, что этот ответ будет полезен для кого-то, я также очень плохо знаком с bash и SSH, но нашел 95% знаний, которые мне нужны здесь :)
источник
предположим, что я запускаю скрипт ruby в фоновом режиме с помощью команды ниже
тогда я могу получить pid выше фонового процесса, указав имя команды. В моем случае команда - это ruby.
вывод
Теперь вы можете легко убить процесс, используя команду kill
источник
ps -ef
иkill
оба были хорошо освещены выше, так что же нового?jobs -l должен дать вам pid для списка процессов nohup. убить (-9) их осторожно. ;)
источник
kill -9
только если вы не знаете, что обычные сигналы не работают.Вы могли бы попробовать
источник
pkill [command name]
вы можете использовать-o
флаг для уничтожения самого старого процесса сопоставления, или-n
вместо этого использовать самый новый.Это работает в
Ubuntu
Введите это, чтобы узнать
PID
Весь запущенный процесс относительно java будет показан
В моем случае это
Теперь убей это
kill -9 3315
Процесс зомби наконец остановился.
источник
Предположим, что вы выполняете Java-программу с nohup, вы можете получить идентификатор процесса Java с помощью
вывод
тогда вы можете убить процесс, набрав
или скажем, что вам нужно убить все процессы Java, а затем просто использовать
эта команда убивает все Java-процессоры. Вы можете использовать это с процессом. просто дайте имя процесса в конце команды
источник
когда вы создаете задание в nohup, оно сообщит вам идентификатор процесса!
вывод покажет вам идентификатор процесса, как
Вы можете убить его тогда:
источник
Я запустил сервер django с помощью следующей команды.
Это работает на CentOS:
источник
process not found
путаницы с nohup.Сегодня я встретил ту же проблему. И так как это было давно, я полностью забыл, какую команду я использовал и когда. Я попробовал три метода:
ps -ef
команде. Это показывает время, когда вы запускаете ваш процесс, и очень вероятно, что вы не выполняете команду непосредственно перед закрытием ssh (зависит от вас). К сожалению, я не думаю, что последняя команда - это команда, которую я запускаю с использованием nohup, так что это не работает для меня.ps -ef
команде. Это означает Родительский Идентификатор процесса, идентификатор процесса, который создает процесс. Ppid равен 1 в Ubuntu для процесса, который использует nohup для запуска. Тогда вы можете использоватьps --ppid "1"
чтобы получить список, и проверить ВРЕМЯ (общее время ЦП, используемое вашим процессом) или CMD, чтобы найти PID процесса.lsof -i:port
если процесс занимает несколько портов, и вы получите команду. Затем, как и в ответе выше, используйте,ps -ef | grep command
и вы получите PID.Как только вы найдете PID процесса, вы можете использовать его
kill pid
для завершения процесса.источник