LINUX.ORG.RU

pipe в фоне, как получить rc всех элементов пайпа и pid

 


0

1

Привет.

Есть pipe который запускаем в фоне, необходимо получить $PIPESTATUS элементов пайпа и pid фонового таска. Как реаизовать данную затею?

Хватило пока на вот это, но не работает.

{(command1 | command2 | command3) &}; pid=($! ${PIPESTATUS[@]})

Помогите пожалуйста. vodz

Так как pipestatus принадлежит фоновому процессу, то неудивительно, что у вас не получается. Если действительно надо вначале получить номер процесса, а потом дождаться статусов, то передать в родительский процесс на баше можно только или через временные файлы (как разновидность — именованные пайпы, но это в данном случае только усложнит).

TMPFILE=`mktemp -t pst$$.XXXXXX`
piperun() {
        cmd1 | cmd2 | cmd3
        echo ${PIPESTATUS[@]} > "$TMPFILE"
}

piperun &
echo $!
wait $!
cat "$TMPFILE"
rm "$TMPFILE"

vodz ★★★★★
()
Ответ на: комментарий от vodz

временные файлы … именованные пайпы

Ещё можно и через неименованные(corpoc) или /dev/tcp/127.0.0.1/… А ещё иногда можно перенести код, подребляющий PIPESTATUS, внутрь скобок.

DonkeyHot ★★★★★
()
Ответ на: комментарий от DonkeyHot

corpoc

Тут не будет отдельного out для самих команд и получения pipestatus.

или /dev/tcp/127.0.0.1/

Клиент на bash пишется легко, а сервер придётся городить на nc, уж проще таки временные файлы.

А ещё иногда можно перенести код, подребляющий PIPESTATUS, внутрь скобок.

А ещё можно вообще передавать в код завершения только последний статус (ну считать неудачей всё при проблемах в промежуточном pipe). На озвученный ТЗ и был дан ответ.

vodz ★★★★★
()
Ответ на: комментарий от DonkeyHot

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

WoozyMasta
() автор топика
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.