クラスパスが非常に長い私のJavaアプリの場合、psを使用すると、引数リストの終わり近くに指定されたメインクラスが表示されません。これは、/ proc /でのUbuntuシステムのサイズ制限に起因すると思います。 pid/cmdline。この制限を増やすにはどうすればよいですか?
これを動的に変更することはできません。制限はカーネルで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
を使用すると、長さの制限なしで元のコマンドラインにアクセスできます。
この制限が削除された新しいLinuxディストリビューション、たとえばRHEL6.8以降を使用することができます。
"psコマンドの/ proc/pid/cmdlineファイルの長さの制限は、以前はカーネルで4096文字にハードコーディングされていました。この更新により、/ proc/pid/cmdlineの長さが確実になります。無制限。これは、コマンドライン引数が長いプロセスを一覧表示する場合に特に便利です。(BZ#1100069) "
メインクラスが取得したコマンドライン引数の検査に関心があるJavaベースのプログラムの場合、次を実行できます。
jps -m