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