2017-01-23 8 views
0

Я прочитал несколько сообщений здесь о случаях, когда pgrep «кажется» возвращаться, даже если он никогда не должен. Кажется, что ключ - это разница между функциями bash и sh. За исключением того, что в моем случае я подтвердил, что sh действительно является ссылкой на bash.Подтверждение о возврате себя pgrep

  • Я бегу на SuSE 12 x86_64
  • /бен/ш найти ссылку на Баш
  • /бен/Баш реальный двоичный

Я сценарий Ruby, который вызывает pgrep так:

cmd="/usr/bin/pgrep -lf \"#{target}\"" 
    pidList=`#{cmd}` 

мне нужно использовать всю командную строку, потому что я на самом деле, используя аргумент, чтобы однозначно идентифицировать конкретный процесс «Java».

Теперь, из-за какой-то несвязанной глупости, я почти сразу делаю ps -p на каждом из возвращенных предметов. Некоторое время это вызывало у меня большое горе, потому что ps иногда ничего не возвращал. В конце концов я смог поймать случай, когда ps на pid вернул команду pgrep. Но это была сама команда pgrep, а не что-то вроде sh -c "pgrep -f blah"

Чтобы резюмировать:

pgrep никогда не возвращает себя. Но различия в sh vs bash могут привести к тому, что он покажет подоболочку. Но я подтвердил, что sh является ссылкой на bash, поэтому не должно быть разницы в поведении.

Что я подозреваю (и ищу подтверждение), заключается в том, что создается дополнительная подкоманда из-за обратных ссылок Ruby, и это то, что есть (только иногда ... проблемы с синхронизацией?), Подхваченные командой pgrep.

Это была настоящая боль, и я хочу убедиться, что исправление, которое я реализую, действительно заставит проблему уйти. Учитывая код я работаю, я либо собираюсь

  1. присоединять | grep -v grep к концу моей команды
  2. выплеснуть любые результаты, содержащие «Grep» в то время как цикл по возвращенным результатам в Рубине сценарий

Я фигурирую # 2 быстрее, но все равно раздражает меня, что я должен отфильтровать сам pgrep.

Я на правильном пути или вы думаете, что что-то еще играет?

Спасибо за ваше время!

+1

Когда 'bash' вызывается как' sh' он ведет себя как POSIX 'sh', не' bash'. –

+0

Ах, это будет недостающая часть головоломки! Благодаря! –

ответ

0

Ответ уже в комментариях к моему вопросу, но я полагаю, что я закрою это с официальным ответом.

Часть информации я не хватало, что

Когда Баш вызывается как ш он ведет себя как POSIX ш, не Баш. - Jörg W Mittag 23 января в 23:31

Так что да, pgrep вел себя нормально.Но когда вы вызываете его из скрипта Ruby с помощью обратных ссылок, вам все равно нужно отфильтровать «pgrep»

0

Проблема не в вкусе оболочки: процесс оболочки, который вызывает pgrep, также отображается среди процессов (и имеет искомую строку в его полная команда), поэтому нам нужно отфильтровать его так:

pgrep -f target | grep -v $$ 

 Смежные вопросы

  • Нет связанных вопросов^_^