В bash легко запустить несколько параллельных процессов, и затем дождаться их завершения:
some_program A &
some_program B &
some_program C &
wait
Эта простота портится тем, что при сбое в одном из параллельных процессов - нет возможности по простому об этом узнать
(
Read more... )
Comments 12
Reply
Reply
Reply
Reply
xargs можно попросить остановиться немедленно (exit 255):
(echo 'sleep 1; exit 255/sleep 12/sleep 12') | tr '/' '\0' |
xargs -P 10 -0 -t -n 1 bash -c
Меня кстати только что осенило, можно ещё попробовать make -j.
Reply
Reply
Reply
Reply
pkill -P - попробую у себя применить, наверное тоже лучше (у jobs -p + kill есть проблемы с racing conditions, на которые я уже наткнулся).
про результат работы команд - не очень понял, я хочу как можно проще - остановиться когда что-то не так, и потом по письму от робота разбираться в логах. Если надо разбираться в сортах ошибок - то наверное заменю (touch $FAIL) на (echo $? > $FAIL.prog_A). Такое бывает, правда редко (мало скриптов может протащить осмысленную разницу до exit code).
Reply
(
(sleep 10 && echo "1 0" >&2 || echo "1 1" >&2;) &
( ( sleep 5; false; ) && echo "2 0" >&2 || echo "2 1" >&2;) &
) 2>&1 | while read cmd status
do
if [ "$status" != 0 ]
then
echo "cmd $cmd failed: $status."
# you can kill everything here
else
echo "cmd $cmd finished successfully."
fi
done
Тут нет принудительного включения line buffering и использования mkfifo вместо stderr и завёртывания говна с echo в отдельные функции, но идея такая. А так, завернуть всё вот это в подходящую функцию и ок.
Reply
Leave a comment