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
到pigz
(在括號內)的末尾時,它表明pigz
正在處理數據,但是一旦數據傳遞給netcat
我,我就會得到一個永無止境的亂碼數據流,淹沒客戶端的標準輸出。伺服器顯示它需要寫入的文件的大小增加了 0。為什麼這不起作用?
$(...)
是命令替換。您不希望將 的輸出zfs send
作為nc
要讀取的文件名。您想將 的輸出zfs send
作為輸入發送到,pigz
而pigz
將其輸出發送到netcat
,因此:zfs send -R "$zpool@label" | pigz | netcat "$remote_upload_address" "$remote_port"
不要使用UDP。與 TCP 不同,UDP 不提供傳遞保證。
如果你想使用
<
重定向操作符,你可以使用ksh
-style程序替換(也可以在zsh
and中找到bash
):netcat "$remote_upload_address" "$remote_port" < <( zfs send -R "$zpool@label" | pigz)
|
但這與基於標準的等價物相比沒有優勢。在那裡,傳遞給<
重定向運算符的文件名是一個命名管道或/dev/fd/x
指向管道的特殊文件(pigz
寫在管道的另一端)。這是相同的,但涉及一些額外的系統呼叫。另一個區別是 shell 不會等待該
zfs send|pigz
命令(儘管它在讀取其輸出netcat
之前可能不會終止該命令)。pigz
或使用
yash
’ 程序重定向運算符:netcat "$remote_upload_address" "$remote_port" <( zfs send -R "$zpool@label" | pigz)
同樣,這裡的標準語法沒有優勢。
yash
當您希望將一個命令的多個 fd 連接到其他命令的管道時,通常會使用程序重定向。