PS Aux | grep с точкой

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

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

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

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

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

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

Почему это так?

4
задан 16 June 2016 в 16:10

3 ответа

Я предполагаю, что у Вас есть файл, названный selenium.jar, но никакой файл, названный selenium в Вашей текущей папке.

, Если Вы работаете

 ps aux | grep [s]elenium.jar

, оболочка попытается заменить [s]elenium.jar соответствием именам файлов от текущей папки. Если существует файл, названный selenium.jar, который будет соответствовать, и [s]elenium.jar будет заменен selenium.jar.

оболочка затем выполнит команду с замененным значением, т.е.

ps aux | grep selenium.jar

Для предотвращения этой кавычки regex для защиты его от оболочки:

ps aux | grep '[s]elenium.jar'
12
ответ дан 16 June 2016 в 16:10

Проблема здесь, как @Florian проницательно вычисленный, состоит в том, что оболочка разворачивает символы шарика в Вашей строке поиска к имени файла соответствия перед передачей строки к grep.

Выполнение ps aux | grep foo проблематично начиная с grep foo сама команда будет соответствовать foo и тем самым появитесь в выводе. Существует два общих, если замысловатый, обходные решения для этого. Вы любой добавляет a 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
ответ дан 16 June 2016 в 16:10

Вы могли исключить "grep" после начальная буква grep:

ps aux | grep '[s]elenium.jar' | grep -v grep
1
ответ дан 16 June 2016 в 16:10

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

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