Получение pid процесса, присутствующего в начале канала

У меня есть сценарий оболочки, который запускает Java-процесс p1, а также есть не-Java-процесс p2, который принимает входные данные от p1.

Как я могу получить идентификатор процесса p1?

У меня есть сценарий оболочки, который работает непредсказуемо (иногда работает, иногда нет). Я просмотрел сеть, но ни один из ответов не кажется идеальным.

Мой сценарий:

nohup sh -c "exec java p1 | p2 2>&1" &
$pid=`echo $!`
my_pid=exec ps -eo "%p %c %P" | awk -v p=$pid 'p==$3{print $1 $2}' | grep java | sed -e 's/java//'

echo "my_pid $my_pid"

person S Kr    schedule 19.05.2012    source источник
comment
Зачем вам нужен идентификатор процесса, если ваш другой процесс просто должен читать с первого? Можете ли вы просто передать вывод p1 в p2?   -  person Attila    schedule 19.05.2012
comment
возможный дубликат Как получить PID процесс в конвейере   -  person Tom Anderson    schedule 19.05.2012
comment
@TomAnderson Да, я видел это.   -  person S Kr    schedule 20.05.2012
comment
@TomAnderson Да, я видел это. Рекомендуемое решение именованных каналов не работает для меня, мой процесс p1 является длительным процессом, и его можно остановить только позже, прочитав файл pid и вызвав команду kill pid. Использование именованного канала приводит к зависанию моей команды. Я не смог запустить job -p   -  person S Kr    schedule 20.05.2012
comment
У вас могут возникнуть проблемы с jobs -p из-за того, что вы делаете exec. Точно сказать не могу. Однако есть и другие ответы, не связанные с именованными каналами или jobs.   -  person Tom Anderson    schedule 20.05.2012
comment
простая ошибка в приведенном выше скрипте выглядит как $pid=echo $!. То есть, чтобы присвоить значение переменной, используйте: var=..., а не $var=... Также зачем возвращаться, почему бы не просто pid=$! ?   -  person inger    schedule 10.11.2013


Ответы (1)


Это упрощенная версия ответа mmd на вопрос, на который я ссылался:

{ java p1 & echo $! >&2; } | p2 2>&1 &

Это печатает PID p1 при стандартной ошибке. Вы также получаете сообщение от оболочки о том, что команда echo завершена, но вы можете игнорировать это.

person Tom Anderson    schedule 20.05.2012
comment
Хорошо, я понял свою проблему, после запуска родительского процесса я напрямую вызывал свой скрипт. В то время дочерние процессы не порождались. Я добавил сон nohup sh -c exec java p1 | p2 2›&1 & $pid=echo $! sleep 5 my_pid=exec ps -eo %p %c %P | awk -v p=$pid 'p==$3{print $1 $2}' | java | sed -e 's/java//' echo my_pid $my_pid Как я могу использовать ожидание вместо сна? - person S Kr; 21.05.2012
comment
Я не могу прочитать все это в комментарии. Либо добавьте его в вопрос, либо, лучше, задайте новый вопрос. Еще лучше, спросите об этом на unix.stackexchange.com , который специализируется на таких вещах. - person Tom Anderson; 21.05.2012