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

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

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

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

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

  • не может скопировать более 29 файлов на целевой сервер, используя сценарий оболочки
  • Извлечь содержимое файла jar для завивки с помощью scp
  • Файл SCP между двумя серверами, проходящими через несколько серверов
  • scp при попытке скопировать файлы из Linux в windows
  • bash scripting: используя ожидание
  • scp и владелец файла
  • Как скопировать файлы с других серверов, если локальная машина не работает
  • scp: сохранить журналы транзакций?
  • 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 
    Linux и Unix - лучшая ОС в мире.