将进程输出包含在 tar 文件中

将进程输出包含在 tar 文件中

我有一个简单的 bash 脚本来生成压缩的 tar 文件并将其上传到外部服务器以进行备份。除了服务器上的文件之外,我还想包括一些 mysql 数据库的转储。

由于磁盘空间限制,我无法再在生成 tar 存档之前将数据库转储预先生成到磁盘上的文件中。我想做的就是以某种方式将转储直接传输到 tar。

我的第一次尝试是尝试创建一个命名管道并让 tar 读取它。对于每个要转储的数据库,生成一个到 mysqldump 进程的管道:

mkfifo $DB.sql
mysqldump --result-file=$DB.sql $DB &
echo $DB.sql >>$FILELIST

生成要备份的所有文件的列表后:

tar c -P --files-from=$FILELIST | gzip | curl ...

我发现这并不像我预期的那样工作。 tar 只是在归档中生成一个管道条目,而不是读取管道的内容。

我找不到任何 tar 开关来改变行为。有没有办法让 tar 读取管道,就好像它是一个文件一样,或者是否有其他实用程序能够处理这种类型的情况?

答案1

我想你可以使用保险丝文件系统之类的东西,但后来我意识到这在原则上是有问题的,而且这是不可能做到的。

您需要使用tar的输出将其输出到远程系统curl,这意味着tar必须能够完全按顺序写入其输出。但文件tar格式要求存档的每个成员前面都有一个描述它的标头,并且该标头除其他内容外还包含该成员的大小。但是,如果成员文件的内容本身来自管道,则无法tar提前知道大小,因此无法写入标头并继续处理文件数据。

答案2

不太确定这就是你想要的。从管道读取意味着从标准输入读取。这是使用tar xf -(或tar xzf -压缩流)完成的,其中-表示标准输入。与写入标准输出类似:(tar cf -tar czf -)。

相关内容