我是脚本编写新手。我正在编写一个进程状态监视器脚本,该脚本应该在进程被杀死、僵尸或睡眠等时捕获。我不确定这是否真的是一个好的脚本,如果有更好的替代方案,请建议。
对于我面临的问题,下面的脚本可以捕获运行、睡眠、停止等状态。但是对于僵尸进程,我们看到命令的两个 pid pidof zombie
。这被视为错误,并且脚本无法捕获该状态。
任何人都可以建议如何捕获进程的僵尸状态。
顺便说一下,我创建了一个僵尸进程,其状态在 shell 上有时会被视为僵尸。
#!/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(睡眠)
process:pid 12668 的 process_1 具有状态 状态:S(睡眠)
检查僵尸
其 pid 为 12818 12817 ./process_monitor.sh: line 13: [: 12818: unary操作员预期
检查 process_1
其 pid 为 12668
状态:R(正在运行)
进程:pid 12668 的 process_1 具有状态 状态:R(正在运行)
检查僵尸
其 pid 为 12818 12817 ./process_monitor.sh:第 13 行:[:12818:一元操作员预期
$ 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 并依次检查每个。