Як отримати ідентифікатор процесу для вбивства процесу nohup?


204

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

ось як я намагаюся знайти ідентифікатор процесу:

ps -ef |grep nohup 

це команда вбити

 kill -9 1787 787

6
Ви намагаєтесь вбити його зі скрипту чи в командному рядку? Вам потрібно зберегти PID, коли ви це робите, nohupі використовувати його пізніше для kill, або знайти процес за його ім'ям команди у ps -efвисновку і отримати PID від цього. Ви повинні шукати ім'я команди, ні nohup.
lurker

1
@mbratch Ви повинні зробити відповідь замість коментаря.
Ansgar Wiechers

@AnsgarWiechers дякую за пропозицію. Іноді, якщо моя відповідь дуже коротка, або якщо я не впевнений, що вона повністю висвітлює те, що просить ОП, я не вагаюсь, як це відповісти. Я додав відповідь і включив більше інформації.
lurker

Відповіді:


353

Під час використання 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

15
Невелике уточнення, це не так nohup, що друкує PID, це фінал, &який фоном його є, наприклад ls &, показав би PID для запускуls
karmakaze

1
Що робить '2> & 1'?
Viraj

4
@Viraj 2- це дескриптор файлу "стандартна помилка". >- це перенаправлення оболонки, і &1це "дескриптор файлу" стандартного виводу "( &потрібний тут, щоб оболонка не думала, я маю на увазі файл з назвою 1). Тому 2 > &1перенаправляє будь-який стандартний вихід помилки на стандартний вхід. Оскільки попередній > my.logспосіб перенаправити стандартний висновок my.log, нам потрібен спосіб переконатися, що повідомлення про помилки також надходять my.log. 2 > &1гарантує, що такі помилки переходять до стандартного виводу, на що, у свою чергу, йде my.log. Див . Перенаправлення вводу / виводу .
lurker

6
echo $!дає мені pid Nohup замість процесу породив: paste.fedoraproject.org/428697/99695314
Nehal J Wani

1
@Mvorisek &діє як команда роздільник , так що ви могли б спробувати, sh -c "nohup my_command > my.log 2>&1 & echo $! > save_pid.txt". Це може спрацювати, але я цього не пробував.
lurker

91

Я використовую Linux Red Linux на сервері VPS (і через SSH - шпаклівку), для мене працювало наступне:

Спочатку ви перераховуєте всі запущені процеси:

ps -ef

Потім у першому стовпці ви знайдете своє ім’я користувача; Я знайшов це наступні три рази:

  • Одне було з'єднання SSH
  • Другим було з'єднання FTP
  • Останнім був процес nohup

Потім у другому стовпці ви можете знайти PID процесу nohup, і ви лише введете:

kill PID 

(замінюючи PID, звичайно, PID процесу nohup)

І це все!

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


3
Я думаю, ти тут мав на увазі PID замість UID?
wprins

Я згоден з @wprins. Убити UID не вдалося мені, але вбивство PID все-таки зробило.
Райан

У моєму випадку я запустив скрипт тестової оболонки (long_running_script.sh) з nohup та & і dint знаю, як це зупинити. Нарешті, я зробив ps -ef | grep long_running * і закріплює PID. Тоді вбив PID
відмовитись від Джозефа

50

припустимо, я виконую рубіновий скрипт у фоновому режимі з командою нижче

nohup ruby script.rb &

тоді я можу отримати pid вище фонового процесу, вказавши ім'я команди. У моєму випадку команда - рубін.

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
Sanjay Salunkhe

20

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


11
Тільки якщо завдання було розпочато в поточній оболонці. І kill -9якщо ви не знаєте, що звичайні сигнали не працюють.
трійка

1
Це корисно, якщо ви знаходитесь на якомусь докерському зображенні, де не встановлено ps :-)
Андреас Профуз

5

Ви можете спробувати

kill -9 `pgrep [command name]`

2
дуже хороша! Я використовував, що pkill [command name]ви можете використовувати -oпрапор для вбивства найстарішого відповідного процесу або -nзамість нього використовувати найновіший.
zanona

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}

2

коли ви створите роботу в nohup, вона повідомить вам ідентифікатор процесу!

nohup sh test.sh &

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

25013

ви можете вбити його тоді:

kill 25013

1

Я запустив сервер django із наступною командою.

nohup manage.py runserver <localhost:port>

Це працює на CentOS:

:~ ns$netstat -ntlp
:~ ns$kill -9 PID 

Це шлях до вирішення process not foundплутанини з нохупом.
CodeSpent

0

Сьогодні я зустрів ту саму проблему. А оскільки це було давно, я повністю забув, яку команду використовував і коли. Я спробував три методи:

  1. Використання STIME, показаного в ps -ef команді. Це показує час, коли ви запускаєте процес, і дуже ймовірно, що ви nohup, яким ви командуєте, перед тим, як закрити ssh (залежить від вас). На жаль, я не думаю, що остання команда - це команда, яку я запускаю, використовуючи nohup, тому для мене це не працює.
  2. Другий - PPID, також показаний у ps -efкоманді. Це означає ідентифікатор батьківського процесу, ідентифікатор процесу, який створює процес. Ppid 1 в ubuntu для процесу, який використовує nohup для запуску. Потім ви можете скористатися ps --ppid "1"для отримання списку та перевірте TIME (загальний час процесора, який використовуєте ваш процес) або CMD, щоб знайти PID процесу.
  3. Використовуйте, lsof -i:portякщо процес займає деякі порти, і ви отримаєте команду. Тоді, як і відповідь вище, використовуйте, ps -ef | grep commandі ви отримаєте PID.

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

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.