![如果文件列表有前导空格,为什么 tar 会在 100% CPU 时挂起](https://linux22.com/image/63122/%E5%A6%82%E6%9E%9C%E6%96%87%E4%BB%B6%E5%88%97%E8%A1%A8%E6%9C%89%E5%89%8D%E5%AF%BC%E7%A9%BA%E6%A0%BC%EF%BC%8C%E4%B8%BA%E4%BB%80%E4%B9%88%20tar%20%E4%BC%9A%E5%9C%A8%20100%25%20CPU%20%E6%97%B6%E6%8C%82%E8%B5%B7.png)
--files-from <LISTFILE>
如果使用该选项并且<LISTFILE>
包含前导空格,Tar 将因 100% CPU 负载而挂起。这是为什么?
重现:给定两个任意内容的文件file1
和一个包含以下内容的file2
文件:list
file1
file2
当我发出 时tar czf test.tar.gz --files-from list
,该命令永远不会完成,系统负载约为 1。
如果我改变list
去读书
file1
file2
上述tar
命令顺利完成。
在 Ubuntu 14.04.2 LTS 服务器版本和我的 Ubuntu 14.10 桌面上都会发生这种情况;两者都有 GNU tar 1.27.1。
答案1
我已经重现了这种行为。看起来像一个错误。
我修复它降级到 tar v1.26,从这里https://packages.debian.org/wheezy/amd64/tar/download(如果您使用 Debian/Ubuntu,请下载相应的 .deb 版本并使用 dpkg -i 安装)。
答案2
我无法重现您得到的结果,尽管我可以让 tar 在执行您所描述的操作时抛出错误。
忽略这一点,在文件名之前提供带有空格的列表是不正确的;空格在 Unix 中并不是无足轻重的。如果您告诉 tar 文件名为“file2”,则 tar 会查找名为“file2”的文件,如果没有找到,则会出现错误。
如果重命名 file2:
mv file2 ' file2'
然后运行tar,就可以了。
无论哪种方式,tar 都应该出错,而不是像它在您的系统上那样崩溃。