저는 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
, 완료될 때까지 매 분마다 다운로드한 응답을 에코했습니다. 이를 위해 나는 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