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

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

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

  • Какой скрипт perl будет использовать scp-каталог с пробелами?
  • Как перебирать каждый файл в FTP-каталоге с помощью сценария bash
  • Необходимо вставить одинарные кавычки в текстовый файл для использования в качестве SQL-запроса с помощью sed
  • Как повторить запрос пользователю в сценарии оболочки?
  • Использовать xargs вместо псевдонимов
  • Возможно ли создать отдельный список файлов при создании tarball?
  • Есть ли способ достичь этого, используя скрипт bash?

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

  • Shell: как использовать 2 переменные с условием
  • Способ удаления новой строки (^ M) только из переменных, а не из файла
  • случайная перестановка строк текста
  • Интерпретировать пробелы в файле
  • Поиск шаблона в именах файлов с номером
  • Inline debug (xxtrace) в скриптах
  • 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 - лучшая ОС в мире.