Исключение 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 library => "-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мне будет легче понять, когда я вернусь к своему коду.
Так

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

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

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

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

15

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

pgrep daemon_name
pidof daemon_name

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

pgrepпоиск по подстроке в то время как pidofпо точному совпадению - именно то, что мне нужно! Благодарность!
Саша

3

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

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том, что он никогда не будет сообщать о себе как о совпадении. Но вам не нужно получать pid, pgrepа затем убивать соответствующий процесс kill. Используйте pkillвместо:

pkill proc_name

Укажите SIGKILLсигнал ( -9или -KILL) вместо SIGTERM(по умолчанию):

pkill -9 proc_name

Найдите имя процесса ( -l) и arguments ( -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)

Некоторое объяснение было бы хорошо.
Давидбауман

Это в основном то же самое, что принятый ответ, но с другим оформлением.
Скотт
Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.