Linux 如何增加/proc/pid/cmdline 4096字节的限制?
对于具有很长类路径的Java应用程序,在使用ps时,我看不到在arg列表末尾指定的主类。我认为这是由于我的Ubuntu系统对/proc/pid/cmdline的大小限制。如何增加此限制?也许ps的“w”参数就是您想要的。添加两个“w”以获得更大的输出。它告诉ps忽略终端的线宽。我很确定,如果您在/proc/$pid/cmdline中实际看到截断的参数,那么您实际上超过了操作系统支持的最大参数长度。据我所知,在Linux中,大小仅限于内存页大小。请参阅以供参考 解决这个问题的唯一方法是重新编译内核。如果你对解决这个问题感兴趣,那么你可能会发现这篇文章很有用: 附加参考:Linux 如何增加/proc/pid/cmdline 4096字节的限制?,linux,process,classpath,pid,limits,Linux,Process,Classpath,Pid,Limits,对于具有很长类路径的Java应用程序,在使用ps时,我看不到在arg列表末尾指定的主类。我认为这是由于我的Ubuntu系统对/proc/pid/cmdline的大小限制。如何增加此限制?也许ps的“w”参数就是您想要的。添加两个“w”以获得更大的输出。它告诉ps忽略终端的线宽。我很确定,如果您在/proc/$pid/cmdline中实际看到截断的参数,那么您实际上超过了操作系统支持的最大参数长度。据我所知,在Linux中,大小仅限于内存页大小。请参阅以供参考 解决这个问题的唯一方法是重新编译内核
您不能动态更改此限制,该限制是在内核中硬编码的,以fs/proc/base.c格式显示页面大小:
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);
我暂时绕过了ps(或者更确切地说是/proc/PID/cmdline)的4096个字符的命令行参数限制,即使用一个小脚本替换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\u ID.cmdline中删除命令行文本
最后
在获得命令行之后,我总是将脚本移动到类似“java.script”的位置,并将实际的二进制java.orig(cp-a)复制回java。我只在达到4K限制时才使用脚本
转义字符或路径中的空格等可能会有问题,但对我来说效果很好。您可以使用
jconsole
访问原始命令行,而不受所有长度限制。查看Java进程非常有用
这将为您提供主类和jvm参数:
jps -vl | grep <pid>
jps-vl | grep
对于基于Java的程序,如果您只想检查主类获得的命令行参数,可以运行:
jps -m
可以使用较新的linux发行版,在该发行版中取消了此限制,例如RHEL 6.8或更高版本 ps命令的/proc/pid/cmdline文件长度限制以前在内核中硬编码为4096个字符。此更新确保/proc/pid/cmdline的长度不受限制,这对于列出具有长命令行参数的进程特别有用。(BZ#1100069)
不,即使使用ww,它也会在4096处截断。我认为ps是从/prod/pid/cmdline读取的,该行也被截断了。为了澄清@Caskey在“为更大的输出添加两个”中所说的话,输出中的无限宽度为-w-w(或-ww)。@Jay不幸的是,它似乎不是无限的,它被限制为4096个字符。请注意,如果您愿意重新编译内核,可以对其进行调整(请参阅我的注释以获取操作链接)。如果您愿意重新编译内核,则任何内容都可以调整,但仍然无法动态更改。重新编译内核感觉就像搬到了新家,因为您不喜欢前一个的沙发。这个答案现在已经过时了。你评论的第一部分是不正确的。在我的系统上,
getconf ARG_MAX
表示ARG_MAX=2097152
(这意味着我的最大参数长度是2兆字节)。但是,/proc/$pid/cmdline
被截断为页面大小
,即4096。您的how-to链接没有涵盖这一特定情况-我不知道更改fs/proc/base.c
中的相关位是否会导致其他问题。这可能是最简单的方法。您还可以仅为该特定命令设置CLASSPATH
环境变量,或者在CLASSPATH
和命令行之间分割所需的路径。查看完整命令行的好方法,如果您可以访问实际使用的java可执行文件(例如在Eclipse中),我已经将其用于javac,您可以跳过二进制文件的移动,只需创建打印命令行(到文件)的脚本,然后启动java应用程序。确保将脚本放在JDK bin文件夹中。对我来说更糟。截断quickly@HaveAGuess,wfm-它显示主类,不管类路径有多长,这是OP要求的。(它还可以选择显示其他参数。)对我也适用,显示了非常长(超过4096个字符)的Weblogic命令行(Linux 64位)的所有参数。谢谢凯文!我正在尝试jps
查看hadoop java进程的完整类路径。。。由于某种原因,jps
甚至不会显示类路径!谢谢,这对我有用。我需要添加-m选项来查看命令行参数。它可能会起作用,并且会增加长度限制,但对于真正庞大的命令行,它不再起作用,并且会被截断(刚刚经历过)。作为一个非Java的人,我想知道你如何在Windows上运行它。XP有一个极限,我想是2048。