非常に長いクラスパスを持つ Java アプリの場合、ps を使用すると、引数リストの末尾近くに指定されたメイン クラスが表示されません。これは、Ubuntu システムの /proc/pid/cmdline のサイズ制限に起因すると思います。この制限を増やすにはどうすればよいですか?
8 に答える
これを動的に変更することはできません。制限はカーネルで 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);
一時的に、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の制限に達したときにのみ使用します。
エスケープ文字やパスなどのスペースに問題があるかもしれませんが、私にとっては問題なく機能します。
を使用jconsole
して、長さ制限なしで元のコマンド ラインにアクセスできます。
メインクラスが取得したコマンドライン引数を調べるだけのJavaベースのプログラムの場合、次を実行できます。
jps -m
/proc/$pid/cmdline で実際に引数が切り捨てられている場合は、OS でサポートされている引数の最大長を実際に超えていると確信しています。私が知る限り、Linux では、サイズはメモリ ページ サイズに制限されています。参考までに、 「ps ww」の長さ制限を参照してください。
これを回避する唯一の方法は、カーネルを再コンパイルすることです。これを解決するためにそこまで行くことに興味がある場合は、次の投稿が役に立つかもしれません: "Argument list too long": Beyond Arguments and Limitations
追加参照:
ARG_MAX、新しいプロセスの引数の最大長
おそらく、ps への 'w' パラメータが必要です。出力を大きくするには、「w」を 2 つ追加します。端末の行幅を無視するように ps に指示します。