错误代码141与tar命令相关。

10

tar -xvzf $filename.tar.gz || { exit $?; }

这里的脚本将以错误代码141退出。我使用的是Fedora Core 6和tar版本1.15。

虽然不是每次都会出现问题,但超过70%的时间它会失败。

3个回答

28

我知道这个帖子已经有几年的时间了,但我为那些遇到错误而看到这篇文章的人做出评论。

每当您使用压缩选项时,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 以获取标准信号及其相应整数值列表)。

该man页面将SIGPIPE的注释列为“Broken pipe: write to pipe with no readers”。由此,看起来gzip正在尝试向管道写入,但是tar已停止侦听。我猜测这里是gzip成功解压缩了文件,但未经压缩的流不是有效的tar存档。我的建议是在该文件上运行gunzip,然后在结果文件上运行tar,并查看哪个失败了(基于SIGPIPE,我猜测tar会失败)。无论哪种情况,看起来这些工具的版本无法读取该文件(可能是损坏或某种版本冲突)。
这些文件是如何创建的(使用了哪些tar选项等)?它们是在此计算机上还是另一台计算机上创建的?如果您在此计算机上创建.tar.gz文件,是否可以在没有错误的情况下从同一台计算机中提取这些文件?

谢谢!有道理。我在一个 nohup 会话中使用 tar -xzf 时遇到了 141 错误,此会话是由一个在 tar 命令之前被杀死的进程启动的。我的解决方案是延迟子进程杀死父进程直到解压 tar 包完成。也许重定向 tar 的输出可能会有所帮助,但我没有尝试过。 - Alexander Taylor
1
tar的输出被管道传输到另一个进程中并且该进程提前关闭了管道时,也会发生这种情况,例如tar -tf x.tar | headtar -tf x.tar | grep -q .head在读取指定行数后关闭管道,grep -q在找到匹配模式后立即关闭管道)。 - bain
1
请确保 gzip 仍然安装。 (gzip --help) 在我的情况下,一些天才在服务器上覆盖了 /bin/gzip(可能是我)。 - txyoji

2

GNU tar 只会返回一些东西,其中没有 -141。但是,如果它正在运行子进程(例如 gzip),并且该进程异常终止,则会返回 返回代码。

我不确定子进程可能是什么。尝试使用 --verbose 并查看是否有任何线索。


我修改了我的脚本,执行gunzip $filname.tar.gz; tar -xvf $filename.tar。但是tar仍然出现141错误。 - Irfan Zulfiqar
你尝试过使用--verbose运行它吗?有没有任何线索?tar还为远程磁带运行rmt; 偶发问题可能是磁带驱动器的网络问题。了解你正在运行的操作系统可能会有所帮助。 - Charlie Martin

0

作为一种解决方法,我们现在使用 cpio 进行归档,这对我们来说很有效,尽管我想知道为什么 tar 会引起这个问题,它已经存在很长时间了,并且作为标准工具使用多年。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接