40

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

4

8 に答える 8

27

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

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

jps -vl | grep <pid>
于 2010-09-08T15:08:10.067 に答える
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);
于 2008-10-13T22:13:50.847 に答える
9

一時的に、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の制限に達したときにのみ使用します。

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

于 2009-08-17T05:34:27.433 に答える
6

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

于 2010-08-05T19:00:12.760 に答える
0

メインクラスが取得したコマンドライン引数を調べるだけのJavaベースのプログラムの場合、次を実行できます。

jps -m
于 2016-05-26T07:58:36.350 に答える
-2

/proc/$pid/cmdline で実際に引数が切り捨てられている場合は、OS でサポートされている引数の最大長を実際に超えていると確信しています。私が知る限り、Linux では、サイズはメモリ ページ サイズに制限されています。参考までに、 「ps ww」の長さ制限を参照してください。

これを回避する唯一の方法は、カーネルを再コンパイルすることです。これを解決するためにそこまで行くことに興味がある場合は、次の投稿が役に立つかもしれません: "Argument list too long": Beyond Arguments and Limitations

追加参照:
ARG_MAX、新しいプロセスの引数の最大長

于 2008-10-13T22:13:21.427 に答える
-3

おそらく、ps への 'w' パラメータが必要です。出力を大きくするには、「w」を 2 つ追加します。端末の行幅を無視するように ps に指示します。

于 2008-10-13T21:47:34.800 に答える