如何更改此 bash 脚本写入状态文件的方式?

问题描述 投票:0回答:1
!/bin/bash
CONTAINERS=("02252a5761d8" "2ebcc82e729" "dee36183e5aa")
LOG_FILE="/var/log/container_monitor.log"
STATE_FILE="/var/run/container_monitor.state"
update_state() {
    local CONTAINER=$1
    local STATE=$2
    echo "$CONTAINER:$STATE" > $STATE_FILE
}
get_state() {
    local CONTAINER=$1
    if [ -f "$STATE_FILE" ]; then
        grep "^$CONTAINER:" "$STATE_FILE" | cut -d':' -f2
    else
        echo "UNKNOWN"
    fi
}
check_container() {
    local CONTAINER=$1
    local RUNNING=$(podman inspect --format="{{ .State.Running }}" $CONTAINER 2> /dev/null)
    if [ $? -eq 1 ]; then
        echo "$(date '+%Y-%m-%d %H:%M:%S') - UNKNOWN - $CONTAINER does not exist." >> $LOG_FILE
        update_state "$CONTAINER" "UNKNOWN"
        return 3
    fi
    local PREV_STATE=$(get_state "$CONTAINER")
    if [ "$RUNNING" == "false" ]; then
        echo "$(date '+%Y-%m-%d %H:%M:%S') - CRITICAL - $CONTAINER is not running." >> $LOG_FILE
        update_state "$CONTAINER" "CRITICAL"
        return 2
    elif [ "$PREV_STATE" == "CRITICAL" ]; then
        local STARTED=$(podman inspect --format="{{ .State.StartedAt }}" $CONTAINER)
        echo "$(date '+%Y-%m-%d %H:%M:%S') - RECOVERED - $CONTAINER is back online. Started at: $STARTED" >> $LOG_FILE
        update_state "$CONTAINER" "RUNNING"
    else
        update_state "$CONTAINER" "RUNNING"
    fi
    return 0
}
check_all_containers() {
    local EXIT_CODE=0
    for CONTAINER in "${CONTAINERS[@]}"
    do
        check_container $CONTAINER
        local CURRENT_EXIT=$?
        if [ $CURRENT_EXIT -gt $EXIT_CODE ]; then
            EXIT_CODE=$CURRENT_EXIT
        fi
    done
    return $EXIT_CODE
}
check_all_containers

我正在尝试创建 bash 脚本来监视 podman 容器,我使用日志文件来检查代码的工作方式。我希望这段代码(每次代码执行)将数组中添加的每个容器的状态写入 /var/run/container_monitor.state”,但我在输出中只提到了一个容器:

akiae@DESKTOP-50SB6O3:~$ cat /var/run/container_monitor.state
dee36183e5aa:CRITICAL

我该如何改变它并改进代码?

使用 echo "$CONTAINER:$STATE" >> $STATE_FILE 创建另一个“日志文件”

linux bash shell monitoring
1个回答
0
投票

你的问题就在这里:

    echo "$CONTAINER:$STATE" > $STATE_FILE

每次调用

update_state
都会覆盖状态文件。

更改为

    echo "$CONTAINER:$STATE" >> $STATE_FILE
© www.soinside.com 2019 - 2024. All rights reserved.