socat 파이프 대 파이프 다중 열기-쓰기-닫기 및 열기-읽기-닫기 작업

socat 파이프 대 파이프 다중 열기-쓰기-닫기 및 열기-읽기-닫기 작업

한 시스템에서 다른 시스템으로 다중 볼륨 tar를 보내기 위해 두 시스템에서 socat를 사용하려고 합니다. 잠재적으로 페타바이트 규모의 데이터를 마운트된 테이프 아카이브로 이동하려고 하기 때문에 여러 볼륨이 절대적으로 필요합니다.

궁극적으로 나는 다음과 같은 일을 하고 싶습니다.

#  on system1:
socat PIPE:/tmp/pipe1 SYSTEM:"ssh system2 socat - PIPE\:/tmp/pipe2" &
tar -M -L 10G -F /tmp/chvol -cvf /tmp/pipe1 <source-path> &

#  on system2:
cat /tmp/pipe2 > file001.tar
cat /tmp/pipe2 > file002.tar
...

(chvol 스크립트는 단순히 /tmp/pipe1 경로를 에코합니다.)

아직 작동시키지 못했기 때문에 한 시스템에서 다음과 같은 훨씬 간단한 테스트를 실행했습니다.

socat PIPE:/tmp/pipe1 PIPE:/tmp/pipe2 &
sh -c 'while sleep 1; do echo "sending date ..."; date > /tmp/pipe1; done' &
sh -c 'while sleep 1; do echo "slurping ..."; cat < /tmp/pipe2; done' &

Open, Write, Close를 반복하는 Writer 프로세스와 EOF까지 Open, Read, Close를 반복하는 Reader 프로세스를 시뮬레이션하기 위한 것입니다.

그런데 이건 내가 기대했던 것과는 달랐다. 작성자는 기뻐하는 듯 보였지만, 독자는 축적된 텍스트를 한 번에 다 읽고 그 이후로는 통화가 차단된 상태였다 cat < ....

누구든지 (1) 단순화된 테스트에서 실제로 무슨 일이 일어나고 있는지, (2) 어떻게 해야 하는지 설명할 수 있습니까?

나는 두 파이프 모두에 대해 다양한 옵션을 시도했고 shut-*(문제가 EOF 전파에 있다고 가정) 인터넷 검색을 많이 했습니다.

답변1

문제는 단방향 파이프를 원한다고 지정하지 않는다는 것입니다. socat 매뉴얼 페이지에서는 이 경우 에코처럼 작동하는 방법을 설명합니다 PIPE:.

아마도 일어날 일은 fifo 1에 날짜를 처음 쓸 때 socat그것을 읽고 fifo 2에 쓴 다음 fifo 2에 입력이 있음을 확인하고 읽고 fifo 1에 쓰는 식으로 계속되는 것입니다. catsocat가 그것을 읽기 전에 fifo 2의 첫 번째 항목이 성공적으로 비워질 때까지 반복합니다 . 그 후 첫 번째 파일은 cat파일의 끝을 보지 않고 fifo를 계속 읽으며 fifo에 날짜를 계속 쓸 수 있습니다.

-vI/O를 표시하기 위해 socat에 옵션을 추가하면 이를 확인할 수 있습니다.

-u단방향 I/O를 추가하면 아마도 원하는 대로 될 수 있지만 이제는 socat날짜를 쓰고 읽은 후에 종료되므로 루프가 필요합니다.

while socat -v -u PIPE:/tmp/pipe1 PIPE:/tmp/pipe2; do echo new; done &

귀하의 버전에 따라 명령을 스크립트에 tar넣을 수 있습니다 .socat/tmp/chvol


실제 테이프 드라이브가 있는 경우 사용된 솔루션을 볼 수도 있습니다.nbd-서버네트워크를 통해 블록 장치를 내보냅니다.

관련 정보