Мне было интересно, как, если возможно, я могу создать простое управление заданиями в BASH для обработки нескольких команд параллельно. То есть, у меня есть большой список команд для запуска, и я бы хотел, чтобы их работала в любой момент времени.
Я знаю немного о bash, поэтому вот те требования, которые делают его сложным:
- Команды имеют переменное время работы, поэтому я не могу просто создать 2, подождать, а затем продолжить следующие два. Как только одна команда будет выполнена, должна быть запущена следующая команда.
- Контрольный процесс должен знать код выхода каждой команды, чтобы он мог содержать в совокупности количество неудачных
Я думаю, как-то я могу использовать trap
, но я не вижу простого способа получить выходное значение дочернего элемента внутри обработчика.
Итак, любые идеи о том, как это можно сделать?
Ну, вот некоторые доказательства кода концепции, которые, вероятно, должны работать, но он разбивает bash: неверные строки команд, созданные, зависающие, а иногда и дампы ядра.
# need monitor mode for trap CHLD to work
set -m
# store the PIDs of the children being watched
declare -a child_pids
function child_done
{
echo "Child $1 result = $2"
}
function check_pid
{
# check if running
kill -s 0 $1
if [ $? == 0 ]; then
child_pids=("${child_pids[@]}" "$1")
else
wait $1
ret=$?
child_done $1 $ret
fi
}
# check by copying pids, clearing list and then checking each, check_pid
# will add back to the list if it is still running
function check_done
{
to_check=("${child_pids[@]}")
child_pids=()
for ((i=0;$i<${#to_check};i++)); do
check_pid ${to_check[$i]}
done
}
function run_command
{
"[email protected]" &
pid=$!
# check this pid now (this will add to the child_pids list if still running)
check_pid $pid
}
# run check on all pids anytime some child exits
trap 'check_done' CHLD
# test
for ((tl=0;tl<10;tl++)); do
run_command bash -c "echo FAIL; sleep 1; exit 1;"
run_command bash -c "echo OKAY;"
done
# wait for all children to be done
wait
Обратите внимание, что это не то, чего я в конечном счете хочу, но будет основой для получения того, что я хочу.
Followup. Я реализовал систему для этого в Python. Таким образом, любой, кто использует Python для скриптинга, может обладать вышеуказанной функциональностью. См. shelljob