Прогресс загрузки curl в диалоге

Вопрос или проблема

Как я могу правильно отобразить прогресс curl в диалоговом окне?

curl http://mysite.corp/image/root_21.tar.bz2 | tar -C /mnt/dest/ -jxf -

введите описание изображения здесь

Я пробовал эту команду, но, как вы видите, она отображается неправильно.

curl -f -x '' -L http://mysite.corp/image/root_21.tar.bz2 | tar -C /mnt/dest -xjpf - --exclude="dev/*" | dialog --backtitle "dialog" --stderr --title 'Linux Image' --textbox /tmp/log 30 80

введите описание изображения здесь

Эта команда почти мне помогает, но я хочу, чтобы она перезаписывала себя и не отображала новый прогресс на каждой строке. В основном, я хочу, чтобы это выглядело так же, как в оригинальной команде, но в диалоговом окне.

(curl -f -x '' -L http://mysite.corp/image/root_21.tar.bz2  | tar -C /mnt/dest -xjpf - --exclude="dev/*" ) 2>&1 | dialog  --progressbox 20 120

введите описание изображения здесь

Вы можете использовать опцию --progressbox диалога так:

(curl ... | tar ... ) 2>&1 | dialog --progressbox 30 120

2>&1 перенаправляет вывод stderr curl и tar на stdin,
т.е. на трубопровод к dialog.

Перезапись строк (управляющий символ: CR ‘\r’ (возврат каретки))
не поддерживается dialog, поэтому вы получаете каждое изменение прогресса
в отдельной строке.

При загрузке с помощью curl и перенаправлении на tar простой прогресс можно вывести с помощью:

–checkpoint[=NUMBER] отображать сообщения о прогрессе каждые NUMBER-й запись

–checkpoint-action=ACTION выполнять ACTION на каждой контрольной точке

Например, эта команда загрузит и извлечет gz файл, печатая точку каждые 10 контрольных точек:

curl -s -L $url | tar -xz --checkpoint=.10

Чтобы увидеть больше деталей во время прогресса:

  • Удалите “-s” из команды curl, если вы не хотите, чтобы curl выводил “тихий” вывод.
  • Добавьте “-v” к команде tar, чтобы распечатать список файлов, извлекаемых из архива.

dialog --gauge 'Начальный текст' высота ширина ожидает ввод, как 12, который дает текущий процент, но также может принимать ввод вида:

XXX
12
Некоторый текст для отображения
в окне
XXX

Где Некоторый текст... заменяет Начальный текст для каждого обновления.

Таким образом, вы можете отформатировать вывод прогресса curl следующим образом:

export URL=https://...
{
  {
    curl "$URL" 2>&3 3>&- |
      tar ... 3>&-
  } 3>&1 >&4 4>&- |
  perl -C -lane '
    BEGIN {$header = "Загрузка $ENV{URL}...\n\n"; $| = 1}
    $pcent = $F[0];
    $_ = join "", unpack("x3 a7 x4 a9 x8 a9 x7 a*") if length > 20;
    s/ /\xa0/g; # замена пробела на nbsp, так как dialog сжимает пробелы
    if ($. <= 3) {
      $header .= "$_\n";
      $/ = "\r" если $. == 2
    } else {
      print "XXX\n$pcent\n$header$_\nXXX"
    }' 4>&- |
  dialog --gauge "Готовимся к загрузке $URL..." 14 72 4>&-
} 4>&1

Что дает что-то вроде:

введите описание изображения здесь

Ответ или решение

Для корректного отображения прогресса загрузки cURL в диалоговом окне нужно учесть, что стандартный вывод и поведение команды cURL с использованием --progress не поддерживают перезапись строк в диалоговом окне. Вместо этого можно воспользоваться различными подходами, чтобы обрабатывать вывод и отображать его в dialog как прогресс.

Решение 1: Использование --gauge

dialog предоставляет возможность отображать индикатор выполнения с помощью команды --gauge. Вы можете передавать процент выполнения и текст для обновления в диалоговом окне. Простой подход будет выглядеть так:

export URL=http://mysite.corp/image/root_21.tar.bz2
{
  {
    curl -s -L "$URL" | tar -C /mnt/dest -xjpf - --exclude="dev/*"
  } 2>&1 | while IFS= read -r line; do
    if [[ "$line" =~ ([0-9]+)% ]]; then
      percent="${BASH_REMATCH[1]}"
      echo "XXX"
      echo "$percent"
      echo "Загрузка файла: $percent%"
      echo "XXX"
    fi
  done
} | dialog --gauge "Загрузка в процессе..." 10 70

Решение 2: Применение --checkpoint

Вы также можете использовать параметры --checkpoint и --checkpoint-action в cURL для отображения точек проверки во время загрузки:

curl --progress-bar --checkpoint=10 --checkpoint-action=display --output /mnt/dest/root_21.tar.bz2 "$URL" && \
tar -C /mnt/dest -xjpf /mnt/dest/root_21.tar.bz2 --exclude="dev/*" | dialog --progressbox "Распаковка..." 20 80

Решение 3: Форматирование вывода

Для более сложного управления выводом можно использовать awk или perl, чтобы преобразовать вывод в формат, подходящий для dialog:

{
  curl -s -L "$URL" 2>&1 | tar -C /mnt/dest -xjpf - --exclude="dev/*" 2>&1 | \
  perl -C -lane 'BEGIN { $| = 1; } if (/(\d+\.\d+)/) { print "XXX\n$1\nТекущая загрузка: $1%\nXXX"; }'
} | dialog --gauge "Загрузка..." 10 70

Заключение

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

Эти решения позволяют эффективно отображать прогресс загрузки файлов через dialog, сохраняя при этом информативное взаимодействие с пользователем.

Оцените материал
Добавить комментарий

Капча загружается...