2013-02-26 2 views
0

Я пытаюсь выполнить несколько сложных команд grep через скрипт shells, который обрабатывает плавник в терминале вручную. Я не могу для жизни понять, почему это не работает. Цель первого grep - вывести любой идентификатор процесса, прикрепленный к родительскому myPattern. Второй получает идентификатор процесса процесса myPatternСложные команды grep, которые не выполняются в сценарии оболочки

В настоящее время мой сценарий оболочки ничего не возвращает для 1-го. игнорирует часть «grep -v 'grep» во втором.

#!/bin/sh 

ps -ef | grep "$(ps -ef | grep 'myPattern' | grep -v grep | awk '{print $2}')" | grep -v grep | grep -v myPattern | awk '{print $2}' 
ps -ef | grep 'myPattern' | grep -v 'grep' | awk '{print $2}' 

Это нормально работает при работе в терминале вручную. Какие-нибудь идеи, где я наполнил это?

+0

работает просто отлично для меня. – dogbane

+0

FYI использует 'для лучшей переносимости вместо $ ( – akostadinov

+0

, если вы имеете в виду' bash', то лучше всего использовать '#!/Bin/bash' вверху. Ваша система может иметь оболочку bourne (или реагировать как единицу), когда вы используете sh-bang '#!/bin/sh'. Что вы видите, когда используете' set -vx'? Удачи. – shellter

ответ

0

Ваша первая команда неясна. Я не думаю, что он будет надежно делать то, что вы описываете. Он также не защищает от получения идентификатора первого вызова grep. Второй работает для меня. Для запроса кулаков это сильно зависит от используемой вами системы. Легче использовать pstree, чтобы показать вам все дерево процессов под pid. Нравится:

pstree -p 1782 | sed 's/-/\n/g' | sed -n -e 's/.*(\([0-9]\+\)).*/\1/p' 

Вам нужно ограничить pid на одно значение. Если у вас больше значений, вам нужно их пропустить. Если у вас нет pstree, вы можете создать какой-нибудь цикл вокруг ps. Обратите внимание, что даже если ваши текущие команды работали, тогда они поймают только одноуровневые отношения между родителями и дочерними. pstree делает любой уровень.

Я также должен сказать вам, что процесс может убежать от исходного родителя в качестве родительского процесса путем форкирования.

В любом случае без точных сведений, чего вы пытаетесь достичь, и почему, и на какой платформе трудно дать вам отличный ответ. Кроме того, эти утилиты, хотя и присутствующие практически повсеместно, не столь переносимы, как хотелось бы.

Еще одно примечание -/bin/sh часто не является вашей текущей оболочкой. Во многих системах Linux пользователь имеет стандартную оболочку bash, а/bin/sh - тире или другой вариант оболочки. Поэтому, если вы видите различия с тем, что у вас есть в консоли и скрипте, это может быть разница в фактической оболочке, которую вы используете.

на основе обратной связи с пользователями было бы намного легче иметь что-то подобное в Java процесс запускающего скрипта:

java <your params here> & 
echo $! > /var/run/myprog.pid 

Затем скрипт убить будет выглядеть echo /var/run/myprog.pid | xargs kill. Есть более короткие команды, но я думаю, что это более портативно. Дайте реальный код, если хотите более конкретно.

+0

Все это делается в среде solaris. Цель, которую я пытаюсь достичь, является частью двухэтапного процесса. Первый скрипт используется для запуска скрипта оболочки, который выполняет java-программу и запускает это в фоновом режиме. Второй скрипт должен иметь возможность завершить этот Java-процесс. – user2110314