ps aux | grep с точкой

Я пытаюсь написать скрипт, который greps для текущего процесса.

Я пытаюсь избежать фактического grep от возврата из выхода ps aux.

] Однако я получаю переменные результаты, если я использую точку или нет:

ps aux | grep [s]elenium ничего не возвращает.

ps aux | grep [s]elenium.jar возвращает команду grep: [!d4 ]

beebee   36155  0.0  0.0  15940   956 pts/0    S+   16:20   0:00 grep --color=auto selenium.jar

Почему это?

1
задан 16 June 2016 в 06:10

2 ответа

Проблема здесь, как @Florian perceptively выдумал, заключается в том, что оболочка расширяет символы glob в вашей строке поиска до подходящего имени файла перед передачей строки на grep.

Запуск ps aux | grep foo проблематичен, так как команда grep foo сама будет соответствовать foo и поэтому появится на выходе. Для этого существуют два распространенных, хотя и запутанных, обходных решения. Вы либо добавляете grep -v grep в конец трубы, либо используете grep [f]oo. Поскольку grep работает с регулярными выражениями, он будет рассматривать [f] как «любой символ в списке символов внутри скобок». Поскольку единственный символ в скобках - f, [f]oo эквивалентен foo. Однако процесс grep, отображаемый в результатах ps, будет иметь строку [f]oo и, следовательно, не найден grep.

Это становится более сложным, если, как вам кажется, у вас есть файл с именем foo в вашем текущем каталоге. Поскольку вы не указали выражение, которое вы дали grep (поскольку вы использовали [s]elenium, а не '[s]elenium' или "[s]elenium"), оболочка будет рассматривать его как , вычисленный и развернуть это соответствие имени файла. Это делает трюк [s]elenium бесполезным, поскольку то, что фактически передано в grep, это selenium, а не [s]elenium, поэтому grep будет соответствовать самому себе.

Все это, однако, происходит только потому, что вы не используете нужный инструмент для задания. Как это часто бывает, есть приложение для этого! Не используйте grep + ps. Вместо этого используйте pgrep, который предназначен для того, чтобы делать именно то, что вы хотите:

NAME
       pgrep,  pkill  -  look  up  or signal processes based on name and other
       attributes

SYNOPSIS
       pgrep [options] pattern
       pkill [options] pattern

DESCRIPTION
       pgrep looks through the  currently  running  processes  and  lists  the
       process IDs which match the selection criteria to stdout.  All the cri‐
       teria have to match.  For example,

         $ pgrep -u root sshd

Итак, в вашем случае вы можете просто сделать

pgrep selenium

Или, поскольку вы 'запустив его через java, используйте -f, который просматривает всю командную строку:

pgrep -f selenium
5
ответ дан 23 May 2018 в 09:17
  • 1
    Я пробовал pgrep, но я запускаю селен через java -jar, поэтому он не находит его. См. Здесь: askubuntu.com/questions/157075/… – Beebee 15 June 2016 в 19:32
  • 2
    pgrep имеет флаг -f, который позволяет использовать полную командную строку для поиска. Попробуйте pgrep -f selenium – Sergiy Kolodyazhnyy 15 June 2016 в 19:36
  • 3
    @Beebee, что Песня говорит. Вам нужно -f выполнить поиск по всей командной строке, а не только исполняемый файл (java). – terdon♦ 15 June 2016 в 19:47
  • 4
    Cool спасибо :) Я попробую pgrep еще раз. – Beebee 15 June 2016 в 20:00
  • 5
    @johnny, что сказал Dubuque. Единственная причина, по которой оболочка расширяет строку поиска, состоит в том, что у нее были символы glob, поэтому обработанная оболочка была как глобальная. Единственная причина, по которой у него были глобальные символы, это то, что они являются классическим трюком, чтобы остановить появление grep в выходе при разборе ps. И единственная причина, по которой нужен grep, заключалась в том, что ps анализировался. Все эти проблемы исчезают, если вы используете pgrep, который предназначен именно для этой функции. – terdon♦ 16 June 2016 в 00:14

Вы можете исключить «grep» после начального grep:

ps aux | grep '[s]elenium.jar' | grep -v grep
1
ответ дан 23 May 2018 в 09:17
  • 1
    Это аккуратное обходное решение: «Но, к сожалению, на самом деле не отвечает на вопрос« почему », :) – Beebee 15 June 2016 в 18:41
  • 2
    @drew, нет необходимости в grep -v, если вы уже используете grep '[s]elenium' – terdon♦ 15 June 2016 в 20:12

Другие вопросы по тегам:

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