Перейти к содержимому

Исключение grep из списка процессов

26

Я собрал команду, чтобы вернуть идентификатор процесса работающего демона:

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

Он отлично работает и возвращает PID, но также возвращает второй PID, который, по-видимому, является процессом, который я сейчас выполняю. Есть ли способ, которым я могу исключить мою команду из списка возвращенных PID?

Я проверял это несколько раз, и кажется, что моя команда всегда является вторым PID в списке, но я не хочу брать только первый PID, если он неточный.

29 909 просмотров
tak спросил 14 лет назад
T 133

7 ответов

26
Принятый ответ

-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.

Надеюсь это поможет.

Использование «grep -v grep»: просто обратите внимание, что у вас может быть длинная командная строка, включая «grep» (допустим, кто-то написал grep library => «-Llibgrep.so» или «-cp libgrep.jar». По крайней мере, Я бы повторил шаблон: grep -v "grep daemon_name"

phil_w · 11 лет назад · 2

Хороший вопрос, @phil_w, спасибо. Обновил ответ.

Serg ikS · 11 лет назад · 0
Serg ikS ответил 14 лет назад
S 376
23

Вы можете использовать трюк класса персонажа. «[d]» не соответствует «[d]», только «d».

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

Я предпочитаю это использовать | grep -v grep.

Хех, это умный трюк, мне это нравится. Сейчас я все упрощаю, пока учусь, и | grep -v grep будет легче понять, когда я вернусь к своему коду.

tak · 14 лет назад · 0

Я пытаюсь понять, как это работает. Не могли бы вы объяснить, что вы имеете в виду, что "[d]" не соответствует "[d]" только "d" `?

Nowaker · 12 лет назад · 0

@Damian: квадратные скобки являются * метасимволами * (разграничивающими набор символов) в поисковом выражении, поэтому команда grep не будет соответствовать строке вывода ps для самой команды grep (что так и называется" a Второй ПИД »в оригинальном вопросе). выражение a [xy] d ** не ** соответствует тексту a [xy] d, но соответствует тексту axd или тексту ayd. Следовательно, выражение [f] oo соответствует тексту foo, но не тексту [f] oo. Я надеюсь, что это понятно.

RedGrittyBrick · 12 лет назад · 0

Хорошо, я был неправ насчет ARGV. Это просто регулярное выражение. Благодарю.

Nowaker · 12 лет назад · 0

Чертовски умный! Надо было подумать об этом - спасибо!

Subfuzion · 12 лет назад · 0

Я также использую -w, сопоставляя только целые слова и не убивая всех bash с помощью ps -axu | grep [b] a :) ps ... | grep -w [b] a безопаснее.

jm666 · 11 лет назад · 0

Поправьте меня, если я ошибаюсь, но это также должно работать на любой позиции сглаженного символа: ps aux | grep "daem [o] n_name"

meso_2600 · 10 лет назад · 0

@RedGrittyBrick Это не работает, например: ps aux | grep [s] cript1 или ps aux | grep [s] cript2. Строка grep по-прежнему отображается. Не могли бы вы помочь прокомментировать решение? Большое спасибо ! О_О

SOUser · 8 лет назад · 0

@RedGrittyBrick Моя вина. Кажется, строка показывается из-за предыдущих поисков.

SOUser · 8 лет назад · 0
RedGrittyBrick ответил 14 лет назад
R 66 369
15

Избегайте анализа psрезультатов, если есть более надежные альтернативы.

pgrep daemon_name pidof daemon_name 

Да, наконец, управление процессами имеет смысл сейчас.

Błażej Michalik · 10 лет назад · 0

pgrep ищет по подстроке, а pidof по точному совпадению - именно то, что мне нужно! Спасибо!

Sasha · 9 лет назад · 0
grawity ответил 14 лет назад
G 229 123
3

Эта ps -Cопция не универсальна для всех систем на основе Unix, но если она работает на ваших системах. Вместо этого я бы вообще избежал grep:

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

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

MOG73 ответил 13 лет назад
M 31
3

Use pgrep to look for the pid of a process by name:

pgrep proc_name 

With extra process name in the result (-l):

pgrep -l proc_name 

Look for and display the process name (-l) and arguments (-f):

pgrep -lf proc_name_or_argument 

The good thing about pgrep is that it will never report itself as a match. But you don't need to get the pid by pgrep and then kill the corresponding process by kill. Use pkill instead:

pkill proc_name 

Specify the SIGKILL signal (-9 or -KILL) instead of SIGTERM (by default):

pkill -9 proc_name 

Look for the process name (-l) and arguments (-f), ask for confirmation (-I) before killing it by SIGKILL signal (-9 or -KILL):

pkill -KILL -Ilf proc_name_or_argument 

Notice that the -I option is only available on some versions of pkill, e.g. the one on the OS X Mavericks.

Rockallite ответил 11 лет назад
R 211
0

Если вы используете bash, вы также можете сделать это следующим образом, используя ps -eaf

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

Это излишне сложно. Почему бы просто не вызвать ps -eaf | grep "имя_процесса" | awk ''

David Nedrow · 8 лет назад · 0
Shubham Khatri ответил 9 лет назад
S 101
0

эта строка возвращает pid (идентификатор процесса), исключая "grep"

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

Некоторое объяснение было бы хорошо.

davidbaumann · 7 лет назад · 0

Это в основном то же самое, что принятый ответ, но с другим оформлением.

Scott · 7 лет назад · 0
Brian Sanchez ответил 7 лет назад
B 101