web-dev-qa-db-ja.com

/ proc / pid / cmdline 4096バイト制限を増やすにはどうすればよいですか?

クラスパスが非常に長い私のJavaアプリの場合、psを使用すると、引数リストの終わり近くに指定されたメインクラスが表示されません。これは、/ proc /でのUbuntuシステムのサイズ制限に起因すると思います。 pid/cmdline。この制限を増やすにはどうすればよいですか?

40
user27635

これを動的に変更することはできません。制限はカーネルで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);
18
Robert Gamble

Javaプロセス jps を見ると非常に便利です。

これにより、メインクラスとjvm引数が得られます。

jps -vl | grep <pid>
27
Kevin Cross

Ps(または/ proc/PID/cmdline)の4096文字のコマンドライン引数の制限を一時的に回避するには、小さなスクリプトを使用してJavaコマンドを置き換えます。

開発中、私は常にSunから解凍されたJDKバージョンを使用し、LinuxまたはWindowsに関係なく、インストールされているOSのJREまたはJDKを使用しません(たとえば、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はシェルスクリプトのPIDです。コマンドライン引数の数にもシェルの制限があると思います。覚えていませんが、おそらく64K文字でした。

スクリプトを変更して、最後に/tmp/Java.PROCESS_ID.cmdlineからコマンドラインテキストを削除できます。

コマンドラインを取得した後、私は常にスクリプトを「Java.script」のようなものに移動し、実際のバイナリJava.origをJavaにコピー(cp -a)します。スクリプトは、4Kの制限に達したときにのみ使用します。

エスケープ文字やパス内のスペースなどに問題があるかもしれませんが、私にとっては問題なく動作します。

8
user157553

jconsoleを使用すると、長さの制限なしで元のコマンドラインにアクセスできます。

6
Matt

この制限が削除された新しいLinuxディストリビューション、たとえばRHEL6.8以降を使用することができます。

"psコマンドの/ proc/pid/cmdlineファイルの長さの制限は、以前はカーネルで4096文字にハードコーディングされていました。この更新により、/ proc/pid/cmdlineの長さが確実になります。無制限。これは、コマンドライン引数が長いプロセスを一覧表示する場合に特に便利です。(BZ#1100069) "

https://access.redhat.com/documentation/en-US/Red_Hat_Enterprise_Linux/6/html/6.8_Release_Notes/new_features_kernel.html

3
riverfall

メインクラスが取得したコマンドライン引数の検査に関心があるJavaベースのプログラムの場合、次を実行できます。

jps -m
0
kamstrup