リストされているプロセスが実行されているかどうかをファイルで確認し、その場合はそのプロセスを終了する必要があるスクリプトを作成しようとします。
ファイルには同様のリストが含まれています。
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