Мой ответ - это вариант типичного ответа для поиска «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
}
grep --colour
.+1 для краткого ответа @jamzed, однако ОП может потребоваться некоторое объяснение:
Используя это регулярное выражение, вы запускаете процесс, которому его строка ps не будет соответствовать сама по себе, поскольку регулярное выражение совпадает
"django"
и нет"[d]jango"
. Таким образом, вы исключите процесс со строкой «[d] jango», в данном случае это grep; То же самое можно применить к pgrep, egrep, awk, sed и т. Д., Какую бы команду вы не использовали для определения регулярного выражения.От человека 7 регулярное выражение
источник
ps aux | grep [s]cript1
. Не могли бы вы помочь прокомментировать решение?ps | grep [d]jango
ps | grep d[j]ango
...
ps | grep djang[o]
источник
ps aux| grep "[Z] "
ps aux | grep [s]cript1
илиps aux | grep [s]cript2
. Строка grep по-прежнему отображается. Не могли бы вы помочь прокомментировать решение?Вместо этого используйте pgrep:
pgrep -lf django
источник
pgrep
дает мне именно эту проблему. Но я должен сказать, что я тестирую его в CygWin (гдеps
не может показать полную командную строку процесса).pgrep
она совпадает сама по себе. Оказывается, оно совпадало с именемbash
файла скрипта, из которого я его запускал. Добавление-x
исправило это, тогда это делает точное совпадение с именем команды.Ой, подождите, это работает:
источник
grep
, на которое вы не можете рассчитывать в общем случае.ps -d | grep django
от человека PS:
источник
ps
как известно, непереносимы, поэтому без информации о том, для какой платформы это нужно , этот ответ не очень полезен. Более того, этого явно недостаточно, если вы не уверены, что искомый процесс не является лидером процесса (т. Е. Это может помочь, если ваша цель - демон, но обычно это не так).