我正在通过网络发送 ZFS 快照。但是,与大多数另一端有 zfs recv 的示例不同,我的服务器没有 zfs 支持,我只是将其保存为一个大文件。
问题是,我想使用 cron 作业进行 zfs 发送,但我会定期休眠我的计算机。我害怕的是,我将开始备份、休眠、ssh 连接超时,不幸的是,当 ssh (zfs send POOL/vol@snap | ssh user@server "cat > /backup.zfs"
-这看起来很丑陋,可能可以改进)超时时,zfs 仍然返回 0。
有没有办法获得要发送的内容的哈希值(md5、sha、crc,没关系),以便我可以随后将其与结果文件进行比较,或者我必须将其发送两次,一次发送到 md5并再次发送到服务器?
答案1
更新:
您应该能够使用 Bash shell 执行类似的操作:
zfs send [snip] | tee >(md5sum > checksum.log) | ssh [snip]
请参阅Process Substitution
的部分man bash
。 (感谢 Ole Tange 指出了这种简化。)
原答案:
有几种方法可以让您做您想做的事。
您可以编写一个脚本(或 Python 或您选择的语言中的程序),stdin
在读取数据的同时 (a) 计算校验和 (b) 将数据传送到子进程(例如, to ssh
)。
或者,您也可以在 Bash 中执行以下操作:
zfs send [snip] | tee /proc/self/fd/4 4>(md5sum > checksum.log) | ssh [snip]
我没有测试过以上内容,所以我不能保证它会起作用。如果您的系统上没有/proc/self/fd/N
,那么您可能需要查找(或编写)除tee
.请参阅man tee
和REDIRECTION
的部分man bash
,特别是该Redirecting Output
小节。