Как я могу напечатать некоторую строку до завершения команды?

Я использую скрипт bash для загрузки большого файла с клиентского устройства на веб-сервер.

Но так как потребуется много времени, nginx вернет тайм-аут шлюза. То, что я планирую сделать, – передать stdout сценария bash на подпроцесс python и отправить его как ответ. Поскольку scp не будет выводить какой-либо вывод в stdout, мне нужно каждую минуту отправлять ответы, пока команда scp не scp .

Есть ли способ достичь этого, используя скрипт bash?

Также я не могу увеличить тайм-аут Nginx, так как он обычно занимает более 20 минут

  • Как разбить массив в наборе из пяти файлов и загрузить их параллельно?
  • Почему мой счетчик скинов на 8 МБ по сравнению с локальной сетью?
  • Перенос миллионов файлов с одного сервера на другой
  • Скопируйте и получите файлы с одной машины, которая связана через ssh с другим
  • Медленная скорость передачи scp по wan
  • Как скопировать папки с неприятными именами, используя функцию оболочки
  • Команда scp, работающая в bash, не работает в zsh
  • .bashrc пользовательский дополнительный пароль и SCP не работает, (вторичный пароль SSH)
  • 3 Solutions collect form web for “Как я могу напечатать некоторую строку до завершения команды?”

    Вы можете создать процесс, который выполняет некоторый вывод в фоновом режиме, и убить его после выполнения scp :

     (while sleep 60; do echo downloading; done) & PID=$! scp "$1" "$2" kill $PID 

    Вот более общая функция для загрузки и ожидания:

     #! /bin/bash # Wait for process end and show seconds count down # Arg1: PID # Arg2: Expected seconds # Arg3: (optional): dump file # Arg4: (optional): expected file size in bytes function waitpid() { [ -n "$3" ] && touch "$3" local COUNT=$(( $2*10 )) while [ -e /proc/$1 ]; do if [ $(( COUNT%10 )) -eq 0 ]; then echo -en "\r$(( COUNT/10 )) sec" if [ -n "$3" ]; then bytes=$( stat --format=%s $3 ) echo -n " $bytes bytes " if [ -n "$4" ]; then echo -n "$(( $bytes*100/$4 ))% " fi fi fi echo -en ".\e[K" sleep 0.1 [ $COUNT -gt 0 ] && COUNT=$(( COUNT-1 )) done echo } echo "Example 1: Wait for process to be finished" sleep 10 & waitpid $! 10 echo "Example 2: Wait and show file size" for N in {1..5} ; do echo "BAR $N" >> /tmp/foo ; sleep 2 ; done & waitpid $! 10 /tmp/foo 

    Пример вывода:

     Example 1: Wait for process to be finished 3 sec........ Example 2: Wait and show file size 7 sec 160 bytes ....... 

    Изменить: если слишком сложно использовать короткую версию:

     sleep 10 & while [ -e /proc/$! ]; do echo -n . ; sleep 1 ; done 

    Скриншот:

     $ sleep 10 & [1] 5432 $ while [ -e /proc/$! ]; do echo -n . ; sleep 1 ; done ..........[1]+ Done sleep 10 

    ОК, я, наконец, сделал это, я передаю аргументы $1 и $2 для scp , здесь я получаю идентификатор процесса команды scp и до тех пор, пока он не закончится. Я повторяю загрузку ответов каждую минуту. Для этого я использую SECONDS в bash

     t=$SECONDS scp $1 $2 & PROC_ID=$! while kill -0 "$PROC_ID" >/dev/null 2>&1; do n=$(( SECONDS-t)) if (( n > 60 )); then echo downloading t=$SECONDS fi done 
    Interesting Posts

    Как исправить ошибку «xrandr: не удается найти вывод« VGA1 »?

    Запустите git pull из сценария запуска оболочки

    bash / shell pathname для mkdir, touch и т. д.?

    Где можно установить локальное программное обеспечение, которое работает до / usr?

    Эмуляция поведения блокировки прокрутки для запуска USB-переключателя KVM

    Удалите строки, которые не начинаются с шаблона из заданного набора паттернов

    Удаление текста из файла с использованием регулярных выражений

    Измерение длины криволинейной линии

    Есть ли синтаксический файл Vim для вывода приложений CLI на основе ANSI?

    В правилах udev назначается одинаковое имя порта для модема с 4 портами ttyUSB

    vim «поймал смертельный сигнал HUP», какие файлы он сохраняет?

    Как перечислить предварительные условия в GNU Make?

    umount / home не работает

    Перенаправить stderr в файл, но создать, только если произошел какой-либо stderr?

    Как узнать имена потоков, которые выполняются на конкретном ядре

    Linux и Unix - лучшая ОС в мире.