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

use*_*635 40 linux limits pid process classpath

对于具有很长类路径的Java应用程序,在使用ps时,我无法看到在arg列表末尾附近指定的主类.我认为这源于我的Ubuntu系统在/ proc/pid/cmdline上的大小限制.我怎样才能增加这个限制?

Kev*_*oss 27

为了查看Java进程,jps非常有用.

这将为您提供主类和jvm args:

jps -vl | grep <pid>
Run Code Online (Sandbox Code Playgroud)


Rob*_*ble 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);
Run Code Online (Sandbox Code Playgroud)

  • 重新编译内核感觉就像搬到新房子,因为你不喜欢前一个人的沙发. (14认同)
  • 如果您愿意重新编译内核但仍然无法动态更改,则可以调整任何内容. (4认同)
  • [此问题已于 2015 年 6 月修复](https://github.com/torvalds/linux/commit/c2c0bb44620dece7ec97e28167e32c343da22867),此答案现已过时。 (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
Run Code Online (Sandbox Code Playgroud)

然后创建一个脚本/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 $@
Run Code Online (Sandbox Code Playgroud)

然后使脚本可运行

chmod a+x /x/jdks/jdk1.6.0_16_x32/bin/java
Run Code Online (Sandbox Code Playgroud)

如果复制和粘贴上面的内容,你应该确保/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限制时只使用脚本.

转义字符可能存在问题,甚至可能存在路径中的空格等问题,但它对我来说效果很好.


Mat*_*att 6

您可以使用jconsole访问原始命令行而不受所有长度限制.