「残りの行」Javaファイルの名前を知るためにすべての(/ px aux)Javaプロセス行を表示するようにSSHクライアントコンソールを設定する方法は?

「残りの行」Javaファイルの名前を知るためにすべての(/ px aux)Javaプロセス行を表示するようにSSHクライアントコンソールを設定する方法は?

ここに画像の説明を入力してください。

  • 私のホストで3つのJavaプロセスが実行されています。 SSHクライアントを介してホストにアクセスします。プロセスの1つがハングして再起動するには、pidプロセスを終了する必要があります。
  • ファイル名はわかりますが、ファイル番号はわかりません。
  • プロセスは画面内で実行中です。画面に参加すると、Javaプロセスが開いて実行されているため、コマンドを介して停止またはctrl+c停止することはできません。私が見るユニークな解決策はそれを殺すことです。
[root@vmi1478348 ~]# screen -ls
There are screens on:
       18043.lob       (Detached)
       10196.fac       (Detached)
       10100.hu3       (Detached)
       9868.bung       (Detached)
  • この pid 番号はプロセス pid 番号とは異なり、画面 pid 番号にすることができます。したがって、終了すると、終了しようとするJavaプロセスは終了せず、画面は終了します。

  • コマンドを使用するとps auxpidを確認できますが、javaファイル名がjavaプロセス行の末尾にあり、図のようにsshクライアントコンソール画面には出ません。フォントサイズを縮小しようとしましたが、問題が残っています。行の残りの部分は表示されません。メモ帳からコピーする行をマウスで選択しようとしましたが、まだ切り捨てられます。解決策はありますか?

答え1

必要なものは次のとおりですpgrep

pgrep -fa 'file\.jar'
  • -fpgrepファイル名を含む完全呼び出しコマンドラインに対して拡張正規表現を強制的に一致させます。
  • -apgrepフルコールコマンドライン(ファイル名を含む)を強制的に出力し、端末の幅を超えて自動的に行を折ります。

これにより、式に一致するプロセスIDのリストと完全な呼び出しコマンドラインが表示され、必要に応じて各項目が複数行に折りたたまれます。

killこの時点で正しいものを選択するか、代わりにpid同じ正規表現を渡すことができます。 (2番目の方法を使用している場合は、ターゲットプロセスが生成されたリストにのみ表示されることを確認してください。これにより、一致するプロセスがシグナルを生成します。)pkill -fpgrep -fapgrep -fa 'file\.jar'file\.jar


他の方法:可能であれば、htop矢印キーを使用して右にスクロールできます。


screenもう1つの可能な方法:プロセスに正しく信号を送信すると、電波が強制され、最終的にサブプロセスが終了することが保証されます。おそらくこれを調べて、もう一度報告します。私はこのトピックについて少し錆びました。


1技術的には、少なくともLinuxベースのシステムの現在のバージョンのprocps実装では、これはプロセスpgrep(またはその祖先)によって実行された最後のシステムコールに渡された引数スペースといくつかのエスケープ文字を関連付けたものです。 128KiBはprocps'によって報告されたものと同じpidですexecve()ps -wwo args=

答え2

コマンドラインについてもっと知りたい場合は、次のようなpsさまざまな実装があります。procps¹ Linux では、このオプションを 2 回だけ追加すると-w(またはw使用している BSD スタイル API を使用して) 完全なコマンドラインを取得できます²:

ps auxww  # BSD-style
ps -Afww  # standard style

procps'与えられたコマンドを実行するプロセスを報告するオプションpsもあります(経験的方法を使用)。したがって、次のことができます。-C

ps -fwwC java

javaプロセスの完全なコマンドラインを一覧表示します。

file.jarGNU / Linuxでプロセス(または祖先)が実行するコマンドに引数の1つを渡すプロセスを確実に見つけるには、次のようにします。

grep -lFzx file.jar /proc/*/cmdline

(固定文字列と実際に一致する1つ以上のeroで区切られたレコードを含むlファイルを一覧表示します(サブ文字列ではありません)。zfile.jarFx

または実行中のプロセスに制限します/usr/bin/java

find /proc -maxdepth 2 \
  -name cmdline \
  -execdir test exe -ef /usr/bin/java ';' \
  -exec grep -lFzx file.jar {} +

または、より短く効率的なシェルを使用してくださいzsh

print -rC1 /proc/<2->(e[$'
  [[ $REPLY/exe -ef /usr/bin/java && \0$(<$REPLY/cmdline) = *\0file.jar\0* ]]
  ']:t)

(これらのプロセスを終了するには、print -rC1に置き換えますkill)。

file.jarこのアプローチを使用すると、次の引数で1を持つプロセスのみを選択するようにモードを変更して、選択をさらに制限することができます。-jar*\0-jar\0file.jar\0*

それでも@kosが提案したように使用するだけでpkill十分でしょう。

pkill -f '^java (.* )?-jar file\.jar( |$)'

次のように信頼できません。

  • 実行中の実行可能ファイルを確認せずに、渡された引数のみを確認してください。
  • 128KiBの制限に達することができます(たとえば、-jar file.jarringly.unlikely.jar非常に長いJavaコマンドラインの最後のコマンドラインの一致)。
  • 'java and lambada' -f 'jam -jar file.jar'引数がスペースで連結されると、各引数が開始および終了する場所に関する情報が失われるため、たとえば、開始されたプロセスと一致する可能性があります。
  • ロケールエンコーディングの文字でデコードできないコマンドラインにバイトシーケンスがあると失敗します。

これらすべてはほとんど不可能です。


1 Linuxをカーネルとして使用する非組み込みオペレーティングシステムで使用される最も一般的なものです。

psprocpsの²はまだ128KiBに制限されており、以前のバージョンのLinuxでは、情報を取得したコマンドライン(引数リスト)の最初の4KiBのみが公開されていることに注意してください。/proc/<pid>/cmdlineps

答え3

良い解決策ではありませんが、問題の一部を解決しました。 SSHクライアントの設定を編集し、フォントサイズを次のように変更します。1

クレイジーソリューション ここに画像の説明を入力してください。

最長行を選択してメモ帳にコピーする以外は何も読みません。次の行が見つかりました。

root 12868 19.2 8.4 5963840 1381788 pts/1 Sl+ 15:45 3:39 java --illegal-access=permit -Duser.timezone=America/Sao_Paulo -Dlog4j2.formatMsgNoLookups=true -Xms1G -Xmx1G -XX:+UseG1GC -XX:+ParallelRefProcEnabled -XX:MaxGCPauseMillis=200 -XX:+UnlockExperimentalVMOptions -XX:+DisableExplicitGC -XX:+AlwaysPreTouch -XX:G1NewSizePercent=30 -XX:G1MaxNewSizePercent=40 -XX:G1HeapRegionSize=8M -XX:G1ReservePercent=20 -XX:G1HeapWastePercent=5 -XX:G1MixedGCCountTarget=4 -XX:InitiatingHeapOccupancyPercent=15 -XX:G1MixedGCLiveThresholdPercent=90 -XX:G1RSetUpdatingPauseTimePercent=5 -XX:SurvivorRatio=32 -XX:+PerfDisableSharedMem -XX:MaxTenuringThreshold=1 -Dusing.aikars.flags=https://mcflags.emc.gs/ -Daikars.new.flags=true -jar bung.jar nogui

  • 私が望むプロセスの名前はbung.jar今pidを知っています。12868

関連情報