fifo를 사용하는 사용자 정의 셸을 통해 재동기화

fifo를 사용하는 사용자 정의 셸을 통해 재동기화

fifo를 사용하여 만든 사용자 정의 셸에서 rsync를 사용하려고 합니다. 하지만 처리할 방법을 찾을 수 없습니다.

initshfifo를 통해 표준 쉘을 시뮬레이션하는 스크립트:

#!/bin/bash

rm fin
mkfifo fin
rm fout
mkfifo fout
rm ferr
mkfifo ferr
rm farg
mkfifo farg

read arg <farg
cat fin | /bin/bash -i -c "$arg" 1>fout 2>ferr

스크립트는 잘 작동합니다. 다음을 실행하여 테스트할 수 있습니다.(cat fout &) && echo ls > farg

rsync에 전달할 스크립트 rsh:

#!/bin/bash

shift;
cat fout &
cat ferr 1>&2 &
echo "$@" | tee -a out > farg
cat | tee -a out > fin

sleep 2
kill %%
exit

rsync를 호출하는 방법:

rsync -e './rsh' user@fakehost:/

실행하면 제대로 작동 echo ./rsh하고 rsync가 기다리고 있는 것과 같은 셸을 얻게 됩니다. 그러나 rsync가 실행되면 stdin을 닫지 않으므로 "cat | ..."의 중지(EOF)를 기다립니다. 저도 해봤는데 exec 0<>fin전혀 안되네요.

손잡이를 제대로 닫는 비결이 있나요? 아니면 다른 방법이 있나요?

답변1

cat fout다음과 같이 명령이 끝날 때까지 기다릴 수 있습니다 .

#!/bin/bash

shift;
cat fout &
foutid=$!
cat ferr 1>&2 &
echo "$@" | tee -a out > farg
cat | tee -a out > fin <&0 &

wait $foutid

sleep 2
kill %%
exit

관련 정보