处理僵尸进程状态

处理僵尸进程状态

我是脚本编写新手。我正在编写一个进程状态监视器脚本,该脚本应该在进程被杀死、僵尸或睡眠等时捕获。我不确定这是否真的是一个好的脚本,如果有更好的替代方案,请建议。

对于我面临的问题,下面的脚本可以捕获运行、睡眠、停止等状态。但是对于僵尸进程,我们看到命令的两个 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 并依次检查每个。

相关内容