对于我的Java应用程序,它们的类路径非常长。当使用ps命令时,我无法看到指定的主类在参数列表的末尾。我认为这是由于Ubuntu系统在/proc/pid/cmdline上设置了大小限制所致。如何增加此限制?
jps -lvm
对我来说更好 - m
是必需的,用于显示传递给你的Java main
方法的命令行参数(而不是JVM参数)。 - javabrett您无法动态更改此限制,该限制已经硬编码在内核中的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);
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 限制时才使用脚本。
可能存在转义字符和路径中的空格等问题,但对我来说它运行良好。
CLASSPATH
环境变量,或在CLASSPATH
和命令行之间拆分所需路径。 - We Are All Monicajconsole
访问原始命令行,而不受所有长度限制的影响。对于基于Java的程序,如果您只想检查主类收到的命令行参数,可以运行以下命令:
jps -m
我相信如果你在/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
getconf ARG_MAX
表示 ARG_MAX = 2097152
(这意味着我的最大参数长度为2兆字节)。然而,/proc/$pid/cmdline
被截断到 PAGE_SIZE
,即4096。你提供的链接并没有涵盖这种特定情况 - 我不知道改变 fs/proc/base.c
中相关位是否会引起其他问题。 - We Are All Monica