Я пытаюсь написать скрипт, который работает для запуска процесса.
Я пытаюсь избежать возвращения настоящего факта с выхода 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
Почему это так?
Я предполагаю, что у Вас есть файл, названный 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'
Проблема здесь, как @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
Вы могли исключить "grep" после начальная буква grep:
ps aux | grep '[s]elenium.jar' | grep -v grep