백그라운드 작업에서 명령을 실행하고 bash 스크립트에서 결과를 기다리는 방법

백그라운드 작업에서 명령을 실행하고 bash 스크립트에서 결과를 기다리는 방법

특정 명령에 대한 프로세스를 생성하고 실행 중에 해당 출력을 캡처하는 방법은 무엇입니까?

예를 들어, 블록에 작업을 수행하려고 하는데 dd블록이 작업을 수행하고 상태 메시지를 생성하는 동안 dd 진행률의 출력을 사용하여 다른 작업을 수행합니다. 다음 스크립트가 있지만 인쇄가 중단되지 않습니다.

#!/bin/bash

data=$(dd if=/dev/urandom of=/dev/null bs=4096 count=32768 status=progress)&

while [ -z "$data" ]; do
 echo "waiting for data..." "${data}"
 # Do something else while $data is not returned
 sleep 0.1
done

나는 약간의 진전을 이루었지만 여전히 내가 원하는 것은 아닙니다.

    #! /bin/bash
    
    varFileDone=$(mktemp)
    varFileOutput=$(mktemp)
    
    dd if=/dev/urandom of=/dev/null bs=4096 \
count=32768 status=progress 2<&1 >> $varFileOutput && echo 1 > $varFileDone &
    pid=$(pidof dd)
    
    while [[ ! -s $varFileDone ]];
    do
    
    data=$(cat $varFileOutput)
    echo "----->" "$data"
    if [[ -s $data ]];
      then
        echo "we have data"
        echo $data | cut -d"," -f3
      else
        echo "no data yet!"
      fi
      sleep 0.2
    done

답변1

귀하의 질문은 약간 모호합니다. 비동기 환경에서 변수 설정을 사용하는 것은 원래 환경에서 변수 값을 사용할 수 없기 때문에 여기서는 덜 효과적입니다.

& 기호를 사용하는 비동기 호출 &은 로 대체될 수 있습니다 coproc. 이 형식을 사용하는 일부 도구가 있으므로 bash 매뉴얼 페이지를 살펴보는 것이 좋습니다.

사용 예:

#!/bin/bash

coproc COPROC ($(dd if=/dev/urandom of=/dev/null bs=4096 count=32768))

while [[ $COPROC ]]; do  
sleep 0.1
echo waiting!  
done

wait # unnecessary, but proves the asynchronous processes are actually complete
echo "Task done!"

답변2

당신은 시도 할 수 있습니다:

dd if=/dev/urandom of=/dev/null bs=4096 count=32768 & 2>&1 > /tmp/tmp
pid=$(ps|grep dd|awk '{print $1}')
while [[ ! "" = "$pid" ]]
do     
    # Do something else while dd is still writing

    grep "," /tmp/tmp | grep -v "+"|awk '{$2" "$3}'
done

답변3

dd명령 출력을 보고 싶지 않으면 다음과 같이 리디렉션을 추가할 수 있습니다.

data=$(dd if=/dev/urandom of=/dev/null bs=4096 count=32768 2>&1 /dev/null)

2>&1출력 및 오류를 리디렉션하는 데 사용됩니다.

원하는 출력을 수정하세요( /dev/null다른 파일로 교체). tailie 명령을 사용하여 프로세스에서 생성된 출력을 검사 할 수 있습니다 tail -f /your/output/file.

관련 정보