- 私のホストで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 aux
pidを確認できますが、javaファイル名がjavaプロセス行の末尾にあり、図のようにsshクライアントコンソール画面には出ません。フォントサイズを縮小しようとしましたが、問題が残っています。行の残りの部分は表示されません。メモ帳からコピーする行をマウスで選択しようとしましたが、まだ切り捨てられます。解決策はありますか?
答え1
必要なものは次のとおりですpgrep
。
pgrep -fa 'file\.jar'
-f
:pgrep
ファイル名を含む完全呼び出しコマンドラインに対して拡張正規表現を強制的に一致させます。-a
:pgrep
フルコールコマンドライン(ファイル名を含む)を強制的に出力し、端末の幅を超えて自動的に行を折ります。
これにより、式に一致するプロセスIDのリストと完全な呼び出しコマンドラインが表示され、必要に応じて各項目が複数行に折りたたまれます。
kill
この時点で正しいものを選択するか、代わりにpid
同じ正規表現を渡すことができます。 (2番目の方法を使用している場合は、ターゲットプロセスが生成されたリストにのみ表示されることを確認してください。これにより、一致するプロセスがシグナルを生成します。)pkill -f
pgrep -fa
pgrep -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.jar
GNU / Linuxでプロセス(または祖先)が実行するコマンドに引数の1つを渡すプロセスを確実に見つけるには、次のようにします。
grep -lFzx file.jar /proc/*/cmdline
(固定文字列と実際に一致する1つ以上のeroで区切られたレコードを含むl
ファイルを一覧表示します(サブ文字列ではありません)。z
file.jar
F
x
または実行中のプロセスに制限します/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をカーネルとして使用する非組み込みオペレーティングシステムで使用される最も一般的なものです。
ps
procpsの²はまだ128KiBに制限されており、以前のバージョンのLinuxでは、情報を取得したコマンドライン(引数リスト)の最初の4KiBのみが公開されていることに注意してください。/proc/<pid>/cmdline
ps
答え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