tar -xvzf $文件名.tar.gz || { 退出 $?; }
在这里,我的脚本会以 errorCode 141 退出。我正在使用 Fedora Core 6 和 tar 版本 1.15
它不会一直发生,但超过 70% 的时间会失败。
tar -xvzf $文件名.tar.gz || { 退出 $?; }
在这里,我的脚本会以 errorCode 141 退出。我正在使用 Fedora Core 6 和 tar 版本 1.15
它不会一直发生,但超过 70% 的时间会失败。
我意识到这个帖子已经有几年的历史了,但我正在为那些偶然发现这个帖子并出现错误的人发表评论。
每当您使用压缩选项时, tar 都会使用管道隐式打开与底层程序的连接。因此,在 OP 的示例中:tar -xvzf $filename.tar.gz
, tar 实际上会运行类似于以下内容的内容:gunzip $filename.tar.gz | tar -xv -
。您可以通过运行来验证这一点top
,您将在其中看到两个进程(一个用于 tar,一个用于 gzip)。
但有时,管道本身会中断。例如,如果文件不是 gzip 文件。以此为例: tar -xvzf somefile.iso
,这将等同于gunzip somefile.iso | tar -xv -
。在这种情况下,gzip 会出错。当 gzip 出错时,管道将中断。另一种可能性是 gzip 文件是否正确,但其中的 tar 文件已损坏。在这种情况下,gzip 开始将未压缩的流发送到 tar,但随后 tar 意识到有问题并关闭了流。然后这里的 gzip 会出错,因为它的输出已关闭。
在退出值中,高于 128 的值表示因信号而终止,高于 128 的值表示是哪个信号导致终止。因此,如果我们从 OP 的退出代码 141 中减去 128,我们得到 13,它对应于 SIGPIPE(man 7 signal
对于标准信号及其相应整数值的列表)。
手册页将 SIGPIPE 的评论列为“Broken pipe: write to pipe without reader”。因此,看起来 gzip 正在尝试写入管道,但 tar 已停止侦听。我的猜测是 gzip 正在成功解压缩文件,但未压缩的流不是有效的 tar 存档。我的建议是在文件上运行 gunzip,然后在结果文件上运行 tar 并查看哪个失败(基于 SIGPIPE,我的猜测是 tar 会失败)。在任何一种情况下,这些版本的工具似乎都无法读取该文件(损坏或某种版本冲突)。
这些文件是如何制作的(tar 的哪些选项等)?它们是在这台机器上还是在另一台机器上创建的?如果您在这台机器上创建一个 .tar.gz 文件,这台机器可以在没有错误的情况下提取这些文件吗?
GNU tar 只返回一些东西,它们都不是 -141。但是,如果它正在运行一个子进程,例如 gzip,并且该进程异常终止,它会返回该返回码。
我不确定子进程可能是什么。尝试一下,--verbose
看看是否有任何线索。
作为一种解决方法,我们现在使用 cpio 进行归档,这对我们来说现在很好,尽管我想知道为什么 tar 会导致这个问题,它存在很长时间,并且多年来一直被用作标准工具。