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

对于具有很长类path的Java应用程序,在使用ps时,我看不到在arg列表末尾指定的主类。 我认为这源于我的Ubuntu系统在/ proc / pid / cmdline上的大小限制。 我怎样才能增加这个限制?

你不能dynamic改变它,这个限制在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); 

对于查看Java进程jps是非常有用的。

这会给你主要的类和jvm参数:

 jps -vl | grep <pid> 

我暂时绕过了4096个字符的命令行参数限制ps(或者说比较/ proc / PID / cmdline)是通过使用一个小脚本来replacejava命令的。

在开发过程中,我总是使用SUN公司的JDK解压缩版本,不pipe使用Linux还是Windows(例如,下载bin和rpm.bin),都不要使用已安装的操作系统的JRE或JDK。 我不build议更改默认的Java安装脚本(例如,因为它可能会中断更新或覆盖或创build问题或…)

所以假设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 

然后创build一个脚本/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拷贝回java。 当我达到4K限制时,我只使用脚本。

转义字符可能存在问题,甚至可能存在path空间等问题,但对我来说工作正常。

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

有可能使用更新的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

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

 jps -m 

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

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

解决这个问题的唯一方法就是重新编译内核。 如果你有兴趣去解决这个问题,那么你可能会发现这个post很有用: “参数列表太长”:超越参数和限制

其他参考:
ARG_MAX,新进程的参数的最大长度