Я запускаю процес 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 $!дає мені pid Nohup замість процесу породив: paste.fedoraproject.org/428697/99695314
&діє як команда роздільник , так що ви могли б спробувати, sh -c "nohup my_command > my.log 2>&1 & echo $! > save_pid.txt". Це може спрацювати, але я цього не пробував.
Я використовую Linux Red Linux на сервері VPS (і через SSH - шпаклівку), для мене працювало наступне:
Спочатку ви перераховуєте всі запущені процеси:
ps -ef
Потім у першому стовпці ви знайдете своє ім’я користувача; Я знайшов це наступні три рази:
Потім у другому стовпці ви можете знайти PID процесу nohup, і ви лише введете:
kill PID
(замінюючи PID, звичайно, PID процесу nohup)
І це все!
Я сподіваюся, що ця відповідь буде корисною для когось, я теж дуже новачок у баші та SSH, але знайшов 95% знань, які мені тут потрібні :)
припустимо, я виконую рубіновий скрипт у фоновому режимі з командою нижче
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
ps -efі killобидва були добре висвітлені вгорі, тож яка нова частина?
jobs -l повинен дати вам під-лист для переліку процесів nohup. вбийте їх (-9) обережно. ;)
kill -9якщо ви не знаєте, що звичайні сигнали не працюють.
Припустимо, ви виконуєте програму 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плутанини з нохупом.
Сьогодні я зустрів ту саму проблему. А оскільки це було давно, я повністю забув, яку команду використовував і коли. Я спробував три методи:
ps -ef команді. Це показує час, коли ви запускаєте процес, і дуже ймовірно, що ви nohup, яким ви командуєте, перед тим, як закрити ssh (залежить від вас). На жаль, я не думаю, що остання команда - це команда, яку я запускаю, використовуючи nohup, тому для мене це не працює.ps -efкоманді. Це означає ідентифікатор батьківського процесу, ідентифікатор процесу, який створює процес. Ppid 1 в ubuntu для процесу, який використовує nohup для запуску. Потім ви можете скористатися ps --ppid "1"для отримання списку та перевірте TIME (загальний час процесора, який використовуєте ваш процес) або CMD, щоб знайти PID процесу.lsof -i:portякщо процес займає деякі порти, і ви отримаєте команду. Тоді, як і відповідь вище, використовуйте, ps -ef | grep commandі ви отримаєте PID.Як тільки ви знайдете PID процесу, тоді можете використовувати його kill pidдля завершення процесу.
nohupі використовувати його пізніше дляkill, або знайти процес за його ім'ям команди уps -efвисновку і отримати PID від цього. Ви повинні шукати ім'я команди, ніnohup.