특정 명령에 대한 프로세스를 생성하고 실행 중에 해당 출력을 캡처하는 방법은 무엇입니까?
예를 들어, 블록에 작업을 수행하려고 하는데 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
다른 파일로 교체). tail
ie 명령을 사용하여 프로세스에서 생성된 출력을 검사 할 수 있습니다 tail -f /your/output/file
.