Я запускаю процесс 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
.