Виключення grep із переліку процесів


27

Я створив команду повернути ідентифікатор процесу запущеного демона:

ps aux | grep daemon_name | awk "{ print \$2 }"

Він прекрасно працює і повертає PID, але він також повертає другий PID, імовірно, це процес, який я зараз запускаю. Чи є спосіб я виключити свою команду зі списку повернених PID?

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


Відповіді:


27

-vкомутатор grep повертає результат, виключаючи його з черги. Тож зробіть це так:

ps aux | grep daemon_name | grep -v "grep daemon_name" | awk "{ print \$2 }"

Upd . Ви також можете використовувати -Cперемикач, щоб вказати ім'я команди так:

ps -C daemon_name -o pid=

Останнє -oвизначає, які стовпці інформації, яку ви хочете в списку. pidперелічує лише стовпець ідентифікатора процесу. І знак рівності =після pidозначає, що для цього не буде заголовка стовпця, тому ви отримуєте лише чіткі числа - PID.

Сподіваюся, це допомагає.


2
Використання "grep -v grep": Просто слідкуйте за тим, що у вас може бути довгий командний рядок, включаючи "grep" (Скажімо, хтось написав бібліотеку grep => "-Llibgrep.so" або "-cp libgrep.jar". Принаймні Я повторю схему: grep -v "grep daemon_name"
phil_w

Добрий момент, @phil_w, дякую. Оновлено відповідь.
Serg ikS

23

Можна використовувати трюк класів символів. "[d]" не відповідає "[d]" лише "d".

 ps aux | grep [d]aemon_name | awk "{ print \$2 }"

Я вважаю за краще це використовувати | grep -v grep.


Хе, це розумна хитрість, мені це подобається. На сьогоднішній день я все просто прощу, хоча під час навчання, і мені | grep -v grepбуде легше зрозуміти, коли я переглянув свій код.
так

Я намагаюся зрозуміти, як працює ця [h] ack. Чи можете ви поясніть, що ви маєте на увазі "[d]" does not match "[d]" only "d"?
Nowaker

@Damian: Квадратні дужки - це метахарактеристики (що розмежовують набір символів) у виразі пошуку, тому grepкоманда не відповідатиме psвихідному рядку для самої grepкоманди (те, що в оригінальному запитанні називало "другим PID"). Вираз a[xy]dце НЕ відповідає тексту , a[xy]dале це робить текст збігу axdабо текст ayd. Отже, вираз [f]ooвідповідає тексту, fooале не тексту [f]oo. Я сподіваюся, що це зрозуміло.
RedGrittyBrick

Гаразд, я помилявся про ARGV. Це просто регулярний вираз. Спасибі.
Nowaker

Чортово розумний! Довелося подумати про це на хвилинку - дякую!
Subfuzion

15

Уникайте розбору psрезультатів, якщо є більш надійні альтернативи.

pgrep daemon_name
pidof daemon_name

Так, нарешті управління процесом має сенс зараз.
Błażej Michalik

pgrepпошук по підрядках при pidofточній відповідності - конкретність, що мені потрібно! Спасибі!
Саша

3

Цей ps -Cваріант не є універсальним для всіх систем на базі Unix, але якщо він працює у ваших системах. Натомість я б взагалі уникав грепу:

ps aux | awk '/daemon_name/ && !/awk/ { print $2 }'

Не потрібно уникати нічого в одних лапках. ps auxдасть вам повний перелік процесів у більшості систем на базі Unix і awkзазвичай встановлюється за замовчуванням.


3

Використовуйте, pgrepщоб шукати pid процесу за назвою:

pgrep proc_name

З додатковою назвою процесу в результаті ( -l):

pgrep -l proc_name

Шукайте та відображайте ім'я процесу ( -l) та аргументів ( -f):

pgrep -lf proc_name_or_argument

Хороша річ у pgrepтому, що він ніколи не буде повідомляти про себе як про матч. Але вам не потрібно отримувати під, pgrepа потім вбивати відповідний процес kill. Використовуйте pkillзамість цього:

pkill proc_name

Вкажіть SIGKILLсигнал ( -9або -KILL) замість SIGTERM(за замовчуванням):

pkill -9 proc_name

Шукайте ім'я процесу ( -l) та аргументи ( -f), запитайте підтвердження ( -I) перед тим, як вбити його SIGKILLсигналом ( -9або -KILL):

pkill -KILL -Ilf proc_name_or_argument

Зауважте, що ця -Iопція доступна лише в деяких версіях pkill, наприклад, в OS X Mavericks.


0

Якщо ви використовуєте bash, ви також можете це зробити наступним чином, використовуючи ps -eaf

PIDS=$(ps -eaf)
PID=$(echo "$PIDS" | grep "process_name" | awk '{print $2}')
echo $PID

Це зайво складно. Чому б просто не зателефонуватиps -eaf | grep "process_name" | awk '{print $2}'
Девід Недроу

0

цей рядок повертає pid (ідентифікатор процесу), виключаючи "grep"

PID=$(ps aux | grep '/usr/bin/python2.7 manage.py SES__boto3_sqs_read' | grep -v grep)

Деякі пояснення було б добре.
davidbaumann

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