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

27

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

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

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

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

Tak
источник

Ответы:

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.

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

Serg ikS
источник
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.

RedGrittyBrick
источник
Хех, это умный трюк, мне это нравится. Пока я учусь, я все упрощаю, и | 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
grawity
источник
Да, наконец, управление процессами имеет смысл сейчас.
Блажей Михалик
pgrepпоиск по подстроке в то время как pidofпо точному совпадению - именно то, что мне нужно! Благодарность!
Саша
3

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

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

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

MOG73
источник
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.

Rockallite
источник
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)
Брайан Санчес
источник
Некоторое объяснение было бы хорошо.
Давидбауман
Это в основном то же самое, что принятый ответ, но с другим оформлением.
Скотт