对于具有很长类路径的Java应用程序,在使用ps时,我看不到在arg列表末尾附近指定的主类。我认为这源于我的Ubuntu系统在/ proc / pid / cmdline上的大小限制。如何增加此限制?
答案 0 :(得分:27)
答案 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)“
答案 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忽略终端的线宽。