ファイルにリストされている複数のプロセスを終了する

ファイルにリストされている複数のプロセスを終了する

リストされているプロセスが実行されているかどうかをファイルで確認し、その場合はそのプロセスを終了する必要があるスクリプトを作成しようとします。

ファイルには同様のリストが含まれています。

process01:0
process02:0
process03:0
process04:0
process05:0

ノート:これらのプロセスの一部はデュアルモードで実行されるため、リストされているプロセスの1つには2〜3つの異なるプロセスがあります。

例:

user01@qhost0001:/home/user01>ps x
   PID TTY      STAT   TIME COMMAND
  3514 pts/2    S+     0:00 vim test_script.sh
  3844 pts/1    R+     0:00 ps x
 87844 pts/0    S+     0:00 -bash
100947 ?        S      0:00 sshd: user01@pts/1
100948 pts/1    Ss     0:00 -bash
101434 ?        S      0:00 sshd: user01@pts/2
101435 pts/2    Ss     0:00 -bash
127678 ?        S      0:00 process05 -c process05.cf
127869 ?        S      0:00 process01 -c process01.cf
127872 ?        S      0:00 process01 -c process01.cf
127879 ?        S      0:00 process03 -c process03.cf
127890 ?        S      0:00 process03 -c process03.cf
127904 ?        S      0:00 process03 -c process03.cf
128389 ?        S      0:00 process04 -c process04.cf

これまでに作成したスクリプトは次のとおりです。

#!/bin/bash

proc_name=$(awk -F':' '{ print $1 }' /app/config/process_failures.cf)
PID=$(ps -ef | grep "$proc_name" | grep -v grep | grep -v PID | awk '{print $2}')

test() {
for p in $proc_name
do
  ps -ux | grep $p > /dev/null

if [ $? -eq 0 ]; then
        echo "Process $p is runnning."
        echo "Killing the processes"
        pgrep -f $p | xargs kill -9
        else
                echo "Process $p not running."
        fi

done
}

main() {

echo $PID
#test
}

main

エコーに返された内容を見ると、ファイルリストにあるよりも多くのプロセスが返されます。ホストシステムで実行されているすべてのプロセスを表示します。 「ps -ux」に変更すると、ユーザーが実行しているすべてのプロセスが表示されますが、変数内のコマンドなどの他のプロセスも表示されます。

だから私はどこが間違っているのか分かりません。誰かが私が間違っている場所を明確にするのに役立ちますか?

事前にありがとう

答え1

だから@White Owlの助けを借りて、私は次の解決策を得ました:近いうちに新しいプロセスがないことを知り、プロセスリストファイルの使用法を変更しました。だから私はスクリプトから直接プロセス配列を作成しました。

#!/bin/bash

processes=("main_mon" "sql_feed" "sql_intra" "sql_select" "topc" "iact" "isca" "iann" "dv2sql_so" "dv2sql_sorpc" "dv2sql_careo" "slamm" "slamm_mon" "dv2sql_socnt" "mmmtp" "ebus")

check_and_kill() {
for p in ${processes[@]};
do
  ps -ux | grep $p > /dev/null

if [ $? -ge 1 ]; then
        echo "Process $p is runnning."
        echo "Killing the processes"
        killall -s 9 -r $p -v
        else
                echo "No $p process is running."
        fi

done
}

main() {
check_and_kill
}

main

これが私が見つけた解決策です。ありがとう

PS:冗談です。 awkやsedとの関係はTomとJerryと同じです。

答え2

名前で終了するプロセスを定義する場合は、標準ツールを確認する必要がありますkillall

したがって、すべてのprocessXXを終了するには、次のようにします。

killall -r "process[:digit:][:digit:]" --verbose

関連情報