Админы делятся на три категории:

  1. Те, кто не делает архивы.
  2. Те, кто уже делает архивы.
  3. Те, кто делает и уже проверяет.

Сейчас многие архиваторы и компрессоры умеют делать архивы в несколько потоков. А проверяют почему-то в один.

У меня на СХД валится куча разных архивов, и их приходится проверять. Чтобы ускорить процесс, можно использовать 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 — время полного выполнения скрипта.

Роман Шубин
Роман Шубин
CEO & CTO, Главред в «Цифровой улей»
Задать вопрос
На данный момент все задания завершены. Можно отправлять лог.
man nproc wc
help exec jobs wait