Вопрос: Как предотвратить «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)?

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


48
2018-03-09 05:42


Источник




Ответы:


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

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

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

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

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

Таким образом, вы можете написать переносную 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
}

10
2018-03-05 01:49





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

ps | grep "[d]jango"

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

От пользователя 7 regex

   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.

63
2018-03-09 07:54



Круто. Я действительно довольно удобен с регулярными выражениями, но не мог сразу подумать о том, как предотвратить совпадение регулярного выражения. Прикрепление буквы в квадратных скобках имеет смысл. (В том числе что-то вроде [^!] Также будет работать ...) - Steve Bennett
Это мило и коварно. - ash
В конкретном случае «ps» я использую «[]» в начале имени процесса, которое я ищу. Тогда мне не нужно анализировать имя процесса специально для регулярного выражения, но оно по-прежнему совпадает. - Neromancer
@hmontoliu Это не работает, например: ps aux | grep [s]cript1, Не могли бы вы прокомментировать решение? - SOUser
@hmontoliu Моя вина. Кажется, строка показана из-за предыдущих поисков ... - SOUser


ps | grep [d]jango

ps | grep d[j]ango

...

ps | grep djang[o]


29
2018-03-09 07:10



Добавьте пробел, если вам нужно grep один символ: ps aux| grep "[Z] " - A.D.
@jamzed Это не работает, например: ps aux | grep [s]cript1 или ps aux | grep [s]cript2, Линия grep все еще отображается. Не могли бы вы прокомментировать решение? - SOUser
@jamzed Моя вина. Кажется, строка показана из-за предыдущих поисков ... - SOUser


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


17
2018-03-09 06:19



Как обычно, я забыл упомянуть о платформе (в этом случае OS X). Предположительно pgrep работает с различными linux. - Steve Bennett
Я не согласен, @ramruma. Я пришел к этой теме именно потому, что pgrepдает мне именно эту проблему. Но я должен сказать, что я тестирую его в CygWin (где ps не может показать полную командную строку процесса). - Sopalajo de Arrierez
В руководстве указано: «Выполняющий процесс pgrep или pkill никогда не будет сообщать о себе как о совпадении». И действительно, я этого не видел. - deltab


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

ps | grep django | grep -v grep

11
2018-03-09 05:46



Только в том случае, если в командной строке процесса grep, на которые вы не можете рассчитывать в общем случае. - Michael Kjörling


ps -d | grep django

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

 -d                  Lists information  about  all  processes
                     except session leaders.

8
2017-10-23 14:08



все еще показывает grep на моем ... - Kevin
Да, это работает для меня на OS X. - Steve Bennett
Не работает так хорошо в Linux. - A-B-B
В более общем плане, варианты ps заведомо не переносимы, поэтому без информации о том, для какой платформы это предназначение, этот ответ не очень помогает. Кроме того, это явно не подходит, если вы не уверены, что процесс, который вы ищете, не является лидером процесса (т. Е. Это может помочь, если ваша цель - демон, но обычно не так). - tripleee