1つのプロセスがない場合は、1つのプロセスを除いてすべてを終了する方法

1つのプロセスがない場合は、1つのプロセスを除いてすべてを終了する方法

次のスクリプトがあります。

pid = $(ps -ef | grep my-service | awk '{print $2}')

これは私に実行中のプロセスのPIDを与えますmy-service。実行中の複数のプロセスを処理し、my-service最新のプロセスを除くすべての以前のプロセスを終了するようにスクリプトを更新したいと思います。ただし、実行中のプロセスが1つしかない場合は、そのプロセスを終了します。どうすればいいですか?

ベストアンサー1

pgrep(および)には、プロセス数を計算するための()、最新のPIDのみを取得するための()など、このタスクのいくつかのpkill便利なパラメータがあります。 (詳細)-c--count-n--newestman pgrep

だから私たちはこのcase声明を使うことができます。 pidが返されない場合は終了し、そうであればプロセスを終了します。複数のプロセスが見つかった場合は、grep -v最新のPIDを除くすべてのPIDをターゲットにしてこれをkill

#!/bin/bash

die="my-service"

case $(pgrep -cf "$die") in
    0) exit 0 ;;
    1) pkill -f "$die" ;;
    *) grep -v $(pgrep -nf "$die") <(pgrep -f "$die") | xargs kill ;;
esac

注:-f上記で使用したパラメータは、コマンド全体と一致させるために使用されました。プロセス名のみを一致させるには、このパラメーターを使用しないでください。からman pgrep

-f、--完了

このパターンは通常、プロセス名とのみ一致します。 -fを設定すると、コマンドライン全体が使用されます。

おすすめ記事