私はスクリプトが初めてです。プロセスが終了したり、ゾンビになったり、休止状態になるなどの状況をキャプチャするようになっているプロセス状態モニタスクリプトを作成中です。これが本当に良いスクリプトかどうかはわかりません。より良い選択肢があれば提案してください。
私が直面している問題について、以下のスクリプトは実行中、スリープ中、停止などの状態をキャプチャします。ただし、ゾンビプロセスの場合、コマンドには2つのPIDが表示されますpidof zombie
。これはエラーと見なされ、スクリプトはステータスをキャプチャできません。
誰もがプロセスのゾンビ状態をキャプチャする方法を提案できますか?
ちなみに、私はシェルで時々状態がゾンビと見なされるゾンビプロセスを作成しました。
#!/bin/bash
do_start() {
# List of process names to be monitored for its termination/killing.
declare -a PROCESS_LIST
PROCESS_LIST=("process_1" "process_2" "zombie")
for process in "${PROCESS_LIST[@]}"; do
echo "checking for $process"
pid=$(pidof $process)
echo "its pid is $pid"
if [ $pid ]; then
pid_status=`head /proc/$pid/status | grep "State:*"`
echo $pid_status
if [[ "$pid_status" =~ .*"sleeping"*. ]] || [[ "$pid_status" =~ .*"stopped"*. ]] || [[ "$pid_status" =~ .*"running"*. ]]; then
echo "process:$process with pid $pid is having status $pid_status"
elif [[ "$pid_status" =~ .*"zombie"*. ]]; then
echo "process:$process with pid $pid is having status $pid_status"
fi
else
echo "pid not present" > /dev/null
fi
done
}
while :
do
do_start
sleep 2
done
出力:
process_1
のpidが12668であることを確認してください
。ステータス:S(スリープ)
プロセス:pid 12668 process_1のステータスステータス:S(スリープ)
ゾンビのpidが12818 12817であることを確認してください。
./process_monitor.sh: line 13: [: 12818: 単項演算子の予測
process_1
の pid が 12668 の
状態であることを確認する: R (実行中)
プロセス: pid 12668 process_1 の状態状態: R (実行中)
ゾンビの pid が 12818
12817演算子の期待
$ps ux 出力
xolo 12668 95.3 0.0 4164 360 pts/4 R 15:32 0:07 ./process_1
xolo 12817 0.0 0.0 4160 360 pts/4 S 15:32 0:00 ./zombie
xolo 12818 0.0 0.0 0 0 pts/4 Z 15:32 0:00 [zombie]<defunct>
ベストアンサー1
これはゾンビの状態とは関係がなく、むしろpidof
指定されたプログラムを実行しているすべてのプロセスのpidを返すことに関連しています。プログラムの子プロセスzombie
も呼び出されるため、zombie
両方のPIDが印刷されます。
pidof
-s
pidだけを返すように指示するオプションがあります。または、返されたPIDを列挙し、各PIDを順番に確認することもできます。