特定のプロセス名のPIDを取得し、それを強制終了します

0
2022.01.06

テストサーバー(ローカルアプリケーション)を実行しています。そのプロセスIDを取得して強制終了します。どうやるか?

コマンドnohup ./test-server &を使用してtest-serverを実行しており、を使用してプロセスのPIDを確認しています。

ps -ef | grep 'test-server' | grep -v 'grep' | awk '{ printf $2 }'

出力:

 svr-ser+   42707   42618  0 10:43 pts/2    00:00:00 /bin/sh ./test-server
svr-ser+   42709   42707  0 10:43 pts/2    00:00:00 /bin/sh ./test -Dserver_port=1099 -s -j test-server.log
svr-ser+   42734   42709  9 10:43 pts/2    00:00:01 /usr/bin/java -server -XX:+HeapDumpOnOutOfMemoryError -Xms1g -Xmx1g -XX:MaxMetaspaceSize=256m -XX:+UseG1GC -XX:MaxGCPauseMillis=100 -XX:G1ReservePercent=20 -Djava.security.egd=file:/dev/urandom -Duser.language=en -Duser.region=EN -Dserver_port=1099 -s -j test-server.log

&次のコマンドを使用してプロセスを強制終了します。

ps -ef | grep 'test-server' | grep -v 'grep' | xargs kill -9

出力:

 kill: cannot find process "svr-ser+"
Killed

のみを取得して強制終了する方法

回答
17
2022.01.06

名前を正規表現で記述することができる何かのPIDを取得するには、あなたがあなたのgrepと同じように、単にkill -9 $(pgrep test-server)のように、pgrep test-serverを使用して行うことができます。

しかし、それはあなたが取る必要のない迂回路です。 pkillはそれを直接行います、 pkill -9 test-server

4
2022.01.07

これはどうですか?

nohup ./test-server&echo "$!" > test-server.pid

それで:

"$(<test-server.pid)"を強制終了します

また、 SIGKILLを使用して強制終了すると、サーバーの正常な終了が妨げられる可能性があります。使用(SIGTERMによって送信されるデフォルトの信号)の代わりに。

3
2022.01.06

試す

ps -e -H -o pid,comm | awk '$2 ~ /test-server/ { print $1}' 

またはそれに相当するPOSIX:

 ps -Ao pid= -o comm= | awk '$2 ~ /test-server/ { print $1}' 

pidをチェックする

どこ

  • -Hはヘッダーを印刷しません
  • -o pid,commはpidとコマンドラインのみを出力します
  • test-serverawkフィルタ(あなたはこの部分を調整する必要がある(例えば$3 ~ /test-server/と、コマンドラインの引数にフィルターにargsの代わりに、commを使用することができます)

OKの場合、実行します

ps -Ao pid= -o comm= | awk '$2 ~ /test-server/ { print $1}' | xargs kill
1
2022.01.06

killallを使用-名前でプロセスを強制終了します。

man killallは使用法を表示します。それはかなり賢いです。