Назад | Перейти на главную страницу

Как предотвратить сообщение «ps» о собственном процессе?

$ ps | grep django
28006 ttys004    0:01.12 /usr/bin/python bin/django celeryd --beat
51393 ttys005    0:01.45 /usr/bin/python bin/django celeryd -l INFO
51472 ttys005    0:01.29 /usr/bin/python bin/django celeryd -l INFO
51510 ttys005    0:01.89 /usr/bin/python bin/django celeryd -l INFO
51801 ttys005    0:01.83 /usr/bin/python bin/django celeryd -l INFO
53470 ttys005    0:03.97 /usr/bin/python bin/django celeryd -l INFO
53780 ttys005    0:00.00 grep django

Есть ли способ предотвратить появление отчета о последнем процессе (то есть о grep, запущенном одновременно с моей командой ps)?

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

+1 за краткий ответ @jamzed, однако OP может потребоваться некоторое объяснение:

ps | grep "[d]jango"

Используя это регулярное выражение, вы запускаете процесс, строка ps которого не будет соответствовать самой себе, поскольку регулярное выражение соответствует "django" и нет "[d]jango". Таким образом вы исключите процесс со строкой «[d] jango», в данном случае это grep; То же самое можно применить к pgrep, egrep, awk, sed и т. Д. В зависимости от того, какую команду вы использовали для определения регулярного выражения.

От человека 7 регулярное выражение

   A bracket expression is a list of characters enclosed in "[]".  It nor‐
   mally matches any single character from the list (but see  below).   If
   the  list  begins  with  '^',  it matches any single character (but see
   below) not from the rest of the list.  If two characters  in  the  list
   are  separated  by '-', this is shorthand for the full range of charac‐
   ters between those two (inclusive) in the collating sequence, for exam‐
   ple,  "[0-9]" in ASCII matches any decimal digit.  It is illegal(!) for
   two ranges to share an endpoint, for example, "a-c-e".  Ranges are very
   collating-sequence-dependent,  and portable programs should avoid rely‐
   ing on them.

ps | grep [d]jango

ps | grep d[j]ango

...

ps | grep djang[o]

Вместо этого используйте pgrep: pgrep -lf django

Мой ответ - это вариант типичного ответа на поиск "foobar" в ps листинг. Аргумент "-A" "ps" более портативный, чем "aux"Я полагаю, но это изменение не имеет отношения к ответу. Типичный ответ выглядит так:

$ ps -A -ww | grep [f]oobar

Вместо этого я использую этот шаблон:

$ ps -A -ww | grep [^]]foobar

Основное преимущество заключается в том, что на основе этих шаблонов проще писать сценарии, потому что вы просто объединяете статическую строку [^]] с любым рисунком, который вы ищете. Вам не нужно удалять первую букву строки, затем вставлять ее между квадратными скобками, а затем снова объединять их. При написании сценария в оболочке проще просто вставить [^]] перед узором, который вы искали. Нарезка строк в Bash - отвратительная вещь, поэтому в моем варианте этого нет. Этот вариант говорит, что показывать строки, в которых совпадает шаблон, БЕЗ ведущей правой квадратной скобки]. Поскольку шаблон поиска для исключения квадратной скобки фактически добавляет квадратную скобку к шаблону, он никогда не будет соответствовать самому себе.

Чтобы вы могли написать переносной psgrep команду следующим образом. Здесь я делаю некоторую поправку на различия между Linux, OS X BSD и другими. Это добавляет заголовки столбцов из ps, предоставляет более индивидуальный ps формат, который лучше подходит для моих нужд, и отображает список процессов, расширенный, расширенный, так что ни один из аргументов командной строки не пропущен. Что ж, большинство не упустили. Java - это Java, поэтому она часто действует наихудшим образом, поэтому некоторые службы Java будут работать с превышением максимально допустимой длины аргументов, которые таблица процессов будет отслеживать. Я считаю, что это 1024 символа. Длина одной команды, разрешенная для запуска процесса, намного больше, но таблица процессов ядра не заботится о том, чтобы отслеживать что-либо длиной более 1 КБ. После запуска команды имя команды и список аргументов не нужны, поэтому то, что сохраняется в таблице процессов, является просто информационным.

psgrep ()
{
    pattern=[^]]${1};
    case "$(uname -s)" in
        Darwin)
            ps -A -ww -o pid,ppid,nice,pri,pcpu,pmem,etime,user,wchan,stat,command | grep -i -e "^[[:space:]]*PID" -e ${pattern}
        ;;
        Linux)
            ps -A -ww -o pid,ppid,tid,nice,pri,pcpu,pmem,etime,user,wchan:20,stat,command | grep -i -e "^[[:space:]]*PID" -e ${pattern}
        ;;
        *)  # other UNIX flavors get a minimalist version.
            ps -A -ww | grep -i -e ${pattern}
        ;;
    esac
}

Ой, подождите, это работает:

ps | grep django | grep -v grep

ps -d | grep django

от человека ps:

 -d                  Lists information  about  all  processes
                     except session leaders.