Админы делятся на три категории:
- Те, кто не делает архивы.
- Те, кто уже делает архивы.
- Те, кто делает и уже проверяет.
Сейчас многие архиваторы и компрессоры умеют делать архивы в несколько потоков. А проверяют почему-то в один.
У меня на СХД валится куча разных архивов, и их приходится проверять. Чтобы ускорить процесс, можно использовать GNU Parallel. Мне так неудобно, потому что архивы шифрованные, причём пароли у них разные, удобнее проверять скриптом.
Вот тут Роман набросал рыбу для использования многопоточности. Я немного упростил — до 7 необходимых строк.
#!/bin/bash
declare -x PATH="/usr/local/bin:/usr/bin:/bin"
declare -i JOB_NUM=$(nproc)
declare DELAY=0.5
exec >&2
for i in {1..50}; do # это цикл по всем заданиям
# это команда, выполняемая в фоне
( sleep $(($SRANDOM % 3 + 1)); echo ${SECONDS}_sec ) &
while [[ $(jobs -r -p | wc -l) -ge $JOB_NUM ]]; do
sleep $DELAY
echo $i
done
done
echo end loop
wait
echo TOTAL $SECONDS sec
Ну и небольшая пояснялка:
nproc — число «ядер».
DELAY — задержка между проверками окончания выполнения фоновых заданий. Если задание выполняется долго (проверка архива), можно смело ставить 10–30 секунд.
exec >&2 — перенаправили весь вывод на stderr. В реальном скрипте можно убрать. Как и все echo.
for — основной цикл по списку всех заданий.
sleep $(($SRANDOM % 3 + 1)) — собственно фоновое задание. В данном случае пауза 1–3 секунды.
echo ${SECONDS}_sec — ввёл для примера, чтобы показать, что команд в фоновом задании может быть несколько.
while — как только запустили нужное число фоновых заданий, начинаем ждать окончания одного или нескольких.
echo end loop — как только основной цикл закончился, скрипт можно завершать, но некоторые задания ещё могут долго работать.
wait — ожидать окончания всех фоновых заданий.
echo TOTAL $SECONDS sec — время полного выполнения скрипта.
man nproc wc
help exec jobs wait








Комментарии