Ваша первая команда неясна. Я не думаю, что он будет надежно делать то, что вы описываете. Он также не защищает от получения идентификатора первого вызова 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
. Есть более короткие команды, но я думаю, что это более портативно. Дайте реальный код, если хотите более конкретно.
работает просто отлично для меня. – dogbane
FYI использует 'для лучшей переносимости вместо $ ( – akostadinov
, если вы имеете в виду' bash', то лучше всего использовать '#!/Bin/bash' вверху. Ваша система может иметь оболочку bourne (или реагировать как единицу), когда вы используете sh-bang '#!/bin/sh'. Что вы видите, когда используете' set -vx'? Удачи. – shellter