Как наблюдать pgrep?

Во-первых, необходимо защитить шаблон от расширения оболочкой. Самый легкий способ сделать, который должен поместить одинарные кавычки вокруг этого. Одинарные кавычки предотвращают расширение чего-либо между ними (включая обратные косые черты); единственная вещь, которую Вы не можете сделать затем, имеют одинарные кавычки в шаблоне.

grep -- 'foo*' *.txt

(также отметьте -- end-of-option-marker для остановки некоторых grep реализации включая GNU grep от обработки названного файла -foo-.txt например (который был бы расширен оболочкой от *.txt) быть взятым в качестве опции (даже при том, что это следует за аргументом неопции здесь)).

При необходимости в одинарной кавычке можно записать это как '\'' (закончите строковый литерал, литеральную кавычку, открытый строковый литерал).

grep -- 'foo*'\''bar' *.txt

Во-вторых, grep поддерживает, по крайней мере, v два синтаксиса для шаблонов. Старый, синтаксис по умолчанию (основные регулярные выражения) не поддерживает чередование (|) оператор, хотя некоторые версии имеют его как расширение, но записанный с обратной косой чертой.

grep -- 'foo\|bar' *.txt

Портативный путь состоит в том, чтобы использовать более новый синтаксис, расширенные регулярные выражения. Необходимо передать -E опция к grep выбрать его (раньше, который был, покончили egrep разделите команду ²),

grep -E -- 'foo|bar' *.txt

Другая возможность, когда Вы просто ищете любой из нескольких шаблонов (в противоположность созданию сложного шаблона с помощью разъединения) состоит в том, чтобы передать несколько шаблонов grep. Можно сделать это путем предшествования каждому шаблону с -e опция.

grep -e foo -e bar -- *.txt

Или помещенные шаблоны на нескольких строках:

grep -- 'foo
bar' *.txt

Или сохраните те шаблоны в файле, один на строку и работайте

grep -f that-file -- *.txt

Отметьте это если *.txt расширяется до единственного файла, grep не снабдит префиксом согласующие отрезки длинной линии его имя как он, делает, когда существует больше чем один файл. Работать вокруг этого, с некоторыми grep реализации как GNU grep, можно использовать -H опция, или с любой реализацией, можно передать /dev/null как дополнительный аргумент.


¹ некоторые grep реализации поддерживают еще больше как perl-совместимые с -P, или увеличенные с -X, -K для ksh подстановочных знаков...

², в то время как egrep был удержан от использования POSIX и иногда больше не находится в некоторых системах, в некоторых других системах как Солярис, когда утилиты POSIX или GNU не были установлены, затем egrep Ваша единственная опция как /bin/grep поддержки ни один из -e, -f, -E, \| или многострочные шаблоны

1
03.04.2013, 20:14
1 ответ

Из Вашего комментария необходимо делать pgrep donothing.py или pgrep -x donothing.py.

При использовании pgrep -f это ищет любую команду, которая имеет соответствующую строку в, он - имя и/или аргументы. Нет никакого симпатичного способа отфильтровать результаты. Решение состоит в том, чтобы соответствовать точно, что Вы после, так соответствуйте имени процесса.
pgrep соответствиями по умолчанию просто имя процесса. По умолчанию это будет искать любой процесс, кто имя, содержит строку совпадения. С -x это будет искать любой процесс, кто имя, точно соответствует строке.

pgrep также достаточно умно для понимания сценариев. Если Вам назвали сценарий foo.sh, это обнаружится в ps как /bin/sh foo.sh (или что-то подобное). В этом случае pgrep вместо этого сравнит название сценария. Таким образом, можно сделать pgrep foo.sh или pgrep -x foo.sh.

Таким образом в Вашем случае, необходимо делать pgrep -x donothing.py получить точное совпадение.

Править:
Я должен отметить, что это только работает, если сценарий был запущен как /path/to/donothing.py. Если Вы запускаете его как python donothing.py ничего не выйдет.

В этом случае необходимо использовать regex как pgrep -f '^python donothing.py'.

EDIT2:
Проблема Вы встречаетесь с watch заключает в кавычки. выполнение watch pgrep -f '^python donothing.py' выполнения pgrep без аргументов. -f '^python donothing.py' передается как аргумент watch, нет pgrep как предназначено. Целая команда pgrep должна быть заключена в кавычки.

watch "pgrep -f '^python donothing.py'"

Как другое примечание. Если Вы собираетесь использовать это для другого материала, он мог бы более безопасный сделать

watch "pgrep -f '(^|\S+/)python donothing.py'"

Это поймает случай, где процесс обнаруживается как что-то как /usr/bin/python вместо просто python.

1
27.01.2020, 23:54
  • 1
    Команда, которую я ищу, python donothing.py, с которым не работает Ваше предложение. –  Alex 03.04.2013, 19:42
  • 2
    @Alex обновил ответ. Посмотрите бит после "РЕДАКТИРОВАНИЯ" –  Patrick 03.04.2013, 19:46
  • 3
    Спасибо за обновление, но regex выражение не будет работать с watch (это работает как pgrep автономный, хотя). –  Alex 03.04.2013, 19:48
  • 4
    @Alex, если это работает с pgrep но нет watch затем Вы делаете что-то не так с watch. Можно ли обновить вопрос с полной командой, которую Вы пытаетесь выполнить. Всегда обеспечивайте специфические особенности :-) –  Patrick 03.04.2013, 19:52
  • 5
    , обеспеченные специфические особенности, смотрите обновленный вопрос. –  Alex 03.04.2013, 20:16

Теги

Похожие вопросы