Я запускаю процесс nohup на сервере. Когда я пытаюсь убить его, моя консоль замазки закрывается.
вот как я пытаюсь найти идентификатор процесса:
ps -ef |grep nohup
это команда убить
kill -9 1787 787
Я запускаю процесс nohup на сервере. Когда я пытаюсь убить его, моя консоль замазки закрывается.
вот как я пытаюсь найти идентификатор процесса:
ps -ef |grep nohup
это команда убить
kill -9 1787 787
Ответы:
Когда 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
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), у меня работает следующее:
Сначала вы перечисляете все запущенные процессы:
ps -ef
Затем в первом столбце вы найдете свое имя пользователя; Я нашел это три раза:
Затем во втором столбце вы можете найти PID процесса nohup и набрать только:
kill PID
(конечно, замена PID на PID процесса nohup)
И это все!
Я надеюсь, что этот ответ будет полезен для кого-то, я также очень плохо знаком с bash и SSH, но нашел 95% знаний, которые мне нужны здесь :)
предположим, что я запускаю скрипт 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
ps -efи killоба были хорошо освещены выше, так что же нового?
jobs -l должен дать вам pid для списка процессов nohup. убить (-9) их осторожно. ;)
kill -9только если вы не знаете, что обычные сигналы не работают.
Это работает в 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
Процесс зомби наконец остановился.
Предположим, что вы выполняете 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}
Я запустил сервер django с помощью следующей команды.
nohup manage.py runserver <localhost:port>
Это работает на CentOS:
:~ ns$netstat -ntlp
:~ ns$kill -9 PID
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для завершения процесса.
nohupи использовать его позже дляkill, либо найти процесс по имени его команды вps -efвыходных данных и получить PID из этого. Вы должны искать имя команды, а неnohup.