명령이 완료되기 전에 일부 문자열을 인쇄하는 방법은 무엇입니까?

명령이 완료되기 전에 일부 문자열을 인쇄하는 방법은 무엇입니까?

저는 bash 스크립트를 사용하여 클라이언트 장치에서 웹 서버로 대용량 파일을 다운로드하고 있습니다.

하지만 시간이 많이 걸리기 때문에 nginx는 게이트웨이 시간 초과를 반환합니다. 내가 할 계획은 bash 스크립트의 표준 출력을 Python 하위 프로세스로 연결하여 응답으로 보내는 것입니다. scp는 표준 출력으로 어떤 출력도 생성하지 않으므로 scp명령이 완료될 때까지 매분 응답을 보내야 합니다 .

bash 스크립트를 사용하여 이를 달성할 수 있는 방법이 있습니까?

또한 일반적으로 20분 이상 걸리기 때문에 Nginx 시간 초과를 늘릴 수 없습니다.

답변1

백그라운드에서 일부 출력을 수행하는 프로세스를 생성하고 scp완료되면 종료할 수 있습니다.

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

답변2

다운로드 및 대기를 처리하는 보다 일반적인 함수는 다음과 같습니다.

#! /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

답변3

좋아, 드디어 해냈습니다. 매개변수를 전달했고 $1, $2여기 scp에서 명령의 프로세스 ID를 얻었고 scp, 완료될 때까지 매 분마다 다운로드한 응답을 에코했습니다. 이를 위해 나는 SECONDSbash에서 사용합니다.

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

관련 정보