ZFS가 Pigz, netcat으로 전송됨

ZFS가 Pigz, netcat으로 전송됨

netcat입력을 수신하고 이를 파일로 리디렉션하는 서버의 프로세스를 원격으로 여는 스크립트를 작성 중입니다 .

ssh $remote_upload_user@remote_upload_address "nc -l -p $remote_port > $remote_dir/$backup.gz&"

스크립트는 계속해서 ZFS 스냅샷을 압축한 pigz다음 데이터를 입력으로 다음으로 보냅니다 netcat.

netcat $remote_upload_address -u $remote_port < $(zfs send -R $zpool@label | pigz)

끝에 추가하면 |pv(괄호 안에) 데이터가 처리되고 있음을 표시하지만 일단 데이터가 전달되면 클라이언트의 표준 출력에 끝없이 왜곡된 데이터 스트림이 표시됩니다.pigzpigznetcat

서버에서는 작성해야 하는 파일의 크기가 0만큼 증가했다고 표시합니다. 왜 이것이 작동하지 않습니까?

답변1

$(...)명령 대체입니다. 의 출력이 읽을 zfs send파일 이름이 되는 것을 원하지 않습니다. 의 출력을 에 입력으로 보내고 그 출력을 에 보내 nc려고 합니다 .zfs sendpigzpigznetcat

zfs send -R "$zpool@label" | pigz | netcat "$remote_upload_address" "$remote_port"

UDP를 사용하지 마십시오. TCP와 달리 UDP는 전달 보장을 제공하지 않습니다.

리디렉션 연산자를 사용하려면 -style을 <사용할 수 있습니다 .ksh프로세스교체( zsh및 에도 있음 bash):

netcat "$remote_upload_address" "$remote_port" < <(
  zfs send -R "$zpool@label" | pigz)

그러나 이는 표준 기반의 동급 제품에 비해 이점을 제공하지 않습니다 |. 거기에서 리디렉션 연산자에 전달된 파일 이름은 <명명된 파이프이거나 /dev/fd/x파이프를 가리키는 특수 파일입니다( pigz파이프의 다른 쪽 끝에 기록됨).

이는 동일하지만 몇 가지 추가 시스템 호출이 필요합니다. 또 다른 차이점은 쉘이 명령을 기다리지 않는다는 것입니다 zfs send|pigz(기다린다고 해도 netcat출력을 읽기 전에는 종료되지 않을 수 있습니다).pigz

또는 yash프로세스 리디렉션 연산자를 사용하세요.

netcat "$remote_upload_address" "$remote_port" <(
  zfs send -R "$zpool@label" | pigz)

여기서도 표준 구문에 비해 이점이 없습니다. yash프로세스 리디렉션은 일반적으로 명령의 여러 fd를 다른 명령의 파이프에 연결하려는 경우에 사용됩니다.

관련 정보