Может ли bash порождать несколько процессов и сообщать, сколько из них прошло успешно? - PullRequest
3 голосов
/ 24 сентября 2019

Возможно ли в Bash порождать несколько процессов, и после завершения последнего процесса сообщить, сколько процессов завершилось правильно / нет дамп ядра?

Или лучше сделать это в Python?

(в идеале я бы хотел сообщить, какая команда не выполнена, если есть)

Ответы [ 3 ]

0 голосов
/ 26 сентября 2019

Предполагая, что у вас есть файл с командами:

cmd1
cmd2
cmd3

Тогда это даст вам количество неудачных заданий, если у вас не более 100 сбоев:

cat file | parallel
a=$?; echo $((`wc -l <file`-$a))

Чтобы точно определить, какие задания не были выполнены, используйте --joblog.

cat file | parallel --joblog my.log
# Find non-zero column 7 
grep -v -P '(.*\t){6}0\t.*\t' my.log
0 голосов
/ 26 сентября 2019

Это просто.

Сначала запустите свои задания в фоновом режиме.Запомните pids.

Затем для каждого дочернего элемента выполните wait $pid и посмотрите состояние выхода wait, которое равно статусу выхода pid дочернего элемента, который вы передаете ему.

Еслистатус выхода равен нулю, это означает, что дочерний элемент успешно завершен.

#!/bin/bash

exit 0 &
childs+=($!)
exit 1 &
childs+=($!)
exit 2 &
childs+=($!)
echo 1 &
childs+=($!)

successes=0

for i in "${childs[@]}"; do
        wait $i
        if (($? == 0)); then
                ((successes++))
        fi
done

# will print that 2 processes (exit 0 and echo 1) terminated successfully
printf "$successes processes terminated correctly and didn't core dump\n"
0 голосов
/ 25 сентября 2019

Можно надеяться использовать GNU Parallel и обработку ошибок.Общий пример:

parallel ::: ./processA ./processB ./processC

Конкретный пример ... здесь я запускаю 3 простых задания, каждое из которых заключено в одинарные кавычки, и настраиваю его на остановку после завершения или сбоя всех заданий:

parallel --halt soon,fail=100% ::: 'echo 0 && exit 0' 'echo 1 && exit 1' 'echo 2 && exit 2'

Вывод

0
1
parallel: This job failed:
echo 1 && exit 1
2
parallel: This job failed:
echo 2 && exit 2

По умолчанию он будет запускать N заданий параллельно, где N - это количество ядер вашего ЦП, если вы просто хотите, чтобы заданиячтобы запустить последовательно, используйте:

parallel -j 1 ...

Очевидно, что вы можете передать вывод через grep -c "This job failed" для подсчета сбоев.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...