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

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中,大小仅限于内存页大小。请参阅以供参考 解决这个问题的唯一方法是重新编译内核

对于具有很长类路径的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。