среда, 19 августа 2009 г.

Аналог конструкции "grep -v grep"

Для определения того, запущен ли процесс часто используют команду такого вида:
ps aux | grep foo | grep -v grep
Второй grep при этом убирает из списка процессов саму команду grep foo, которая иногда успевает в него просочиться. Сэкономить один grep можно при помощи такой конструкции:
ps aux | grep [f]oo
Смысл в том, что регулярное выражение [f]oo совпадет со строкой foo в списке процессов, но не совпадет со строкой grep [f]oo, которая может появиться в этом списке. Кроме того, на мой взгляд, вариант без grep -v grep выглядит опрятнее.

Если интересует только PID процесса, то удобнее использовать pgrep(1) или pidof(8). Если вдруг этих программ под рукой не окажется, то подойдет такой вариант:
ps aux | grep [f]oo | awk -F' ' '{ print $2 }'

4 комментария:

  1. Респект, чувак!

    ОтветитьУдалить
  2. Анонимный1 июля 2010 г., 16:13

    Спасибо. Полезно.
    Только, пожалуй, для получения одного только PID резонней было бы использовать что-нить вроде
    ps a | grep [f]oo | awk -F' ' '{ print $1 }'

    ОтветитьУдалить
  3. С тем, что параметр 'u' лиший, я соглашусь, но без указания 'x' будут отображены только процессы у которых есть tty, т.е. только интерактивные программы. По крайней мере в линуксе.

    ОтветитьУдалить