テストサーバー(ローカルアプリケーション)を実行していて、そのサーバーのプロセスIDを取得して終了したいと思います。どうすればいいですか?
test-server
usingコマンドを実行しておりnohup ./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
どのように検索し 42707
て終了できますか?プロセスの終了について非常に具体的に説明したいと思います./test-server
。それがすべてです。
答え1
で説明したように、正規表現で説明できる名前のPIDを取得するには、に示されているようにgrep
単にを使用して実行できます。pgrep test-server
kill -9 $(pgrep test-server)
pkill
しかし、必ずバイパスする必要はありませんpkill -9 test-server
。
答え2
努力する
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とコマンドラインのみを印刷awk
フィルタリングtest-server
(この部分を調整する必要があるかもしれません(たとえば、コマンドライン引数のフィルタリングの代わりに$3 ~ /test-server/
使用)args
comm
よろしければ実行してください。
ps -Ao pid= -o comm= | awk '$2 ~ /test-server/ { print $1}' | xargs kill
答え3
これはどうですか?
nohup ./test-server & echo "$!" >test-server.pid
それから:
「$(<test-server.pid)」を殺します。
また、kill を使用すると、SIGKILL
サーバーが完全にシャットダウンしない可能性が高くなります。代わりにSIGTERM
(から送信された基本信号kill
)を使用してください。
答え4
- を使用してkillall
名前でプロセスを終了します。
man killall
使用法が表示されます。これはとても賢いです。