如何增加/ proc / pid / cmdline 4096字节限制?

时间:2008-10-13 21:43:54

标签: linux process classpath pid limits

对于具有很长类路径的Java应用程序,在使用ps时,我看不到在arg列表末尾附近指定的主类。我认为这源于我的Ubuntu系统在/ proc / pid / cmdline上的大小限制。如何增加此限制?

8 个答案:

答案 0 :(得分:27)

查看Java进程jps非常有用。

这将为您提供主类和jvm args:

jps -vl | grep <pid>

答案 1 :(得分:18)

你不能动态地改变它,这个限制在内核中被硬编码到fs / proc / base.c中的PAGE_SIZE:

 274        int res = 0;
 275        unsigned int len;
 276        struct mm_struct *mm = get_task_mm(task);
 277        if (!mm)
 278                goto out;
 279        if (!mm->arg_end)
 280                goto out_mm;    /* Shh! No looking before we're done */
 281
 282        len = mm->arg_end - mm->arg_start;
 283 
 284        if (len > PAGE_SIZE)
 285                len = PAGE_SIZE;
 286 
 287        res = access_process_vm(task, mm->arg_start, buffer, len, 0);

答案 2 :(得分:8)

我暂时绕过4096字符命令行参数限制ps(或者更确切地说是/ proc / PID / cmdline)是通过使用一个小脚本来替换java命令。

在开发过程中,我总是使用来自SUN的解压缩JDK版本,并且从不使用已安装的操作系统的JRE或JDK,无论是Linux还是Windows(例如,下载bin而不是rpm.bin)。 我不建议更改默认Java安装的脚本(例如,因为它可能会破坏更新或被覆盖或产生问题或...)

假设java命令位于/x/jdks/jdk1.6.0_16_x32/bin/java

首先移动实际的二进制文件:

mv /x/jdks/jdk1.6.0_16_x32/bin/java /x/jdks/jdk1.6.0_16_x32/bin/java.orig

然后创建一个脚本/x/jdks/jdk1.6.0_16_x32/bin/java,例如:

    #!/bin/bash

    echo "$@" > /tmp/java.$$.cmdline
   /x/jdks/jdk1.6.0_16_x32/bin/java.orig $@

然后让脚本运行

chmod a+x /x/jdks/jdk1.6.0_16_x32/bin/java

如果复制并粘贴上面的内容,你应该确保/x/jdks/jdk1.6.0_16_x32/bin/java中没有多余的空格而且#!/ bin / bash是第一行

完整的命令行最终以例如/tmp/java.26835.cmdline其中26835是shell脚本的PID。 我认为命令行参数的数量也有一些shell限制,不记得了,但它可能是64K字符。

您可以更改脚本以从/tmp/java.PROCESS_ID.cmdline中删除命令行文本 最后

在我获得命令行之后,我总是将脚本移动到像“java.script”这样的东西,并将实际的二进制java.orig复制(cp -a)回到java。我只有在达到4K限制时才使用脚本。

转义字符可能存在问题,甚至可能存在路径中的空格等问题,但它对我来说效果很好。

答案 3 :(得分:6)

您可以使用jconsole访问原始命令行,而不受所有长度限制。

答案 4 :(得分:3)

可以使用更新的Linux发行版,其中删除了此限制,例如RHEL 6.8或更高版本

“ps命令的/ proc / pid / cmdline文件长度限制以前在内核中硬编码为4096个字符。此更新确保/ proc / pid / cmdline的长度不受限制,对于列出具有长命令行参数的进程特别有用。(BZ#1100069)“

https://access.redhat.com/documentation/en-US/Red_Hat_Enterprise_Linux/6/html/6.8_Release_Notes/new_features_kernel.html

答案 5 :(得分:0)

对于基于Java的程序,您只想检查主类获得的命令行参数,您可以运行:

jps -m

答案 6 :(得分:-2)

我很确定如果您实际上看到在/ proc / $ pid / cmdline中截断的参数,那么您实际上超过了操作系统支持的最大参数长度。据我所知,在Linux中,大小仅限于内存页面大小。请参阅"ps ww" length restriction 以供参考。

解决这个问题的唯一方法就是重新编译内核。如果您有兴趣到目前为止解决此问题,那么您可能会发现此帖子很有用:"Argument list too long": Beyond Arguments and Limitations

补充参考:
ARG_MAX, maximum length of arguments for a new process

答案 7 :(得分:-3)

也许ps的'w'参数是你想要的。添加两个'w'以获得更大的输出。它告诉ps忽略终端的线宽。