对于具有很长类路径的Java应用程序,在使用ps时,我无法看到在arg列表末尾附近指定的主类.我认为这源于我的Ubuntu系统在/ proc/pid/cmdline上的大小限制.我怎样才能增加这个限制?
为了查看Java进程,jps非常有用.
这将为您提供主类和jvm args:
jps -vl | grep
你不能动态地改变它,这个限制在内核中被硬编码到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);
我暂时绕过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限制时只使用脚本.
转义字符可能存在问题,甚至可能存在路径中的空格等问题,但它对我来说效果很好.
您可以使用jconsole
访问原始命令行而不受所有长度限制.