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