!/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 创建另一个“日志文件”
你的问题就在这里:
echo "$CONTAINER:$STATE" > $STATE_FILE
每次调用
update_state
都会覆盖状态文件。
更改为
echo "$CONTAINER:$STATE" >> $STATE_FILE