当前位置: 首页 > 知识库问答 >
问题:

从java进程生成tar文件时,tar命令卡住了

司空祯
2023-03-14

使用Runtimeexec()方法运行下面的命令,使用java生成目录的tar

tar -zcvf dest.tar.gz -C dirTotar .

用于创建tar的Java代码

    String command = "tar -zcvf dest.tar.gz -C dirTotar .";
    Process process = Runtime.getRuntime().exec(command);
    process.waitFor()
    return process.exitValue();

Java进程是一个服务器,它在每次输入后处理后创建tar文件。在处理了几个输入之后,流程停留在tar步骤。

运行 strace -p 以查找进程是否卡住,并显示在输出下方

strace -p 6782 
Process 6782 attached - interrupt to quit 
write(1, "./file"..., 66

我手动运行了输入目录的tar命令,它工作得很好。任何指示为什么会发生这种情况?

更新:

对于如下所示的目录结构

/tmp/dir1
/tmp/dir2
/tmp/dir3
.
.

进程正在为其生成tar的目录是di1。还有其他进程正在为di2、di3…生成tar…

当为di1生成tar的进程被卡住时,试图为其他目录(di2、di3)生成tar的另一个进程也被卡住了。这可能是问题的原因吗?

共有1个答案

龚钧
2023-03-14

事实1:tar zcv...为每个文件输出,它存档一行,其中包含该文件的文件名。GNU tar,你显然正在使用它,当你用输出文件指定f时,它将列表输出到标准,尽管当f被指定为或默认为- 时,它使用标准(它使用标准输出作为存档)。列表中每行的长度取决于每个文件名,此列表的总长度取决于文件数及其文件名的总长度。

事实 2:由 Java Runtime.exec 运行的进程将其标准定向到另一端提供给 Java 程序的管道,因此 Java 代码可以读取该进程的输出。斯特德雷也是如此,斯特丁的情况正好相反,但在这种情况下,它们并不相关。您的代码不会读取此管道(也不会使用任何管道)。

事实3:当一个进程(如 tar)写入一个管道,并且没有任何东西从该管道(另一端)读取时,当管道缓冲区填满写入过程时,写入过程就会挂起。你的条纹显示焦油(显然是挂在)给fd 1的字样中,这是stdout。管道缓冲区的大小可能因系统而异,有时也取决于其他因素,但通常为几 K 个字节,具体取决于要存档的文件的名称,文件名可能介于数十到数百个文件名之间。

解决方案:要么更改您的代码以从< code>tar中读取输出-请参见< code > process . getinputstream()-要么更改命令(通过删除< code>v),使其不产生(非错误)输出。

PS:正如javadoc中提到的,从Java 5开始,< code>ProcessBuilder是首选。默认情况下,它也使用进出新进程的管道,但是从Java 7开始,它有(几个)方法来改变这一点。

 类似资料:
  • 本文向大家介绍linux tar命令简介,包括了linux tar命令简介的使用技巧和注意事项,需要的朋友参考一下 一、使用介绍 tar命令用来打包,解包和压缩。 1、名词区分 打包:将一大堆文件或目录变成一个总的文件【tar命令】 压缩:将一个大的文件通过一些压缩算法变成一个小文件【gzip,bzip2等】 Linux中很多压缩程序只能针对一个文件进行压缩,这样当你想要压缩一大堆文件时,你得将这

  • 我创建了一个shell脚本,用于执行系统升级。 在终端屏幕上,我们只想打印几条消息来通知用户更新的进度。 部分更新创建文件夹的tar文件以供备份-但当tar命令运行时,它会在屏幕上列出当前正在压缩的所有文件和文件夹-是否可以停止此信息出现在终端屏幕上?

  • 我有一个tar存档,其中包含一些其他tar存档。下面的示例完美地提取了primary.tar文件,但我在访问其中的其他.tar文件时遇到了问题。 这将返回以下内容: 所以我可以访问tar1.tar文件对象。但是,我无法弄清楚如何从tar1.tar中获取成员或内容。

  • 我正在尝试使用Java中的Apache commons compress将tar文件解压缩为。我能够解压缩大部分的tar文件,但很少有失败的,除了下面的例外。我不确定是什么引起了这个问题。tar文件是否已损坏?我可以在windows中使用7zip解压缩文件,但相同的文件在编程解压缩时失败。我正在使用Appache commons-compress1.18 下面是我的代码

  • 问题内容: 我想使用Java将文件夹压缩为tar文件(以编程方式)。我认为必须要有一个开源或库。但是,我找不到这种方法。 或者,我可以制作一个zip文件并将其扩展名重命名为.tar吗? 任何人都可以建议图书馆这样做吗?谢谢! 问题答案: 您可以使用jtar-Java Tar库。 从他们的网站上获取: JTar是一个简单的Java Tar库,它提供了一种使用IO流创建和读取tar文件的简便方法。该A

  • 作为 Linux 系统管理员,最经常使用的备份工具就是 tar 和 cpio 命令。前面在介绍备份介质时,已经使用了 tar 命令,此命令其实是一个文件打包命令,经常在备份文件的场合中使用。 使用 cpio 命令进行数据备份,请阅读《Linux提取RPM包文件(cpio命令)》。 有关 tar 命令的基本用法,请阅读《 Linux tar压缩命令》一节,这里不再过多赘述。下面通过 tar 命令做的