gpt4 book ai didi

bash - 需要简化更新文件

转载 作者:行者123 更新时间:2023-11-29 09:32:00 25 4
gpt4 key购买 nike

我有一个脚本可以测试服务器是否启动并正在运行,如果停止则在日志文件中记录多长时间
脚本工作正常,但我喜欢它少写以加快速度。
就像现在一样,它会为它测试的每个服务器写入完整的日志文件。
可以将信息存储在某个变量或数组中,然后写入一次。

#!/bin/bash

STATUS="/usr/local/server.info"
LOG="/var/log/servers_up_log"

# What server to monitor
SRV=(SR1 SR2 SR3)

# Test if log file exists, if not create it.
if [[ ! -f "$LOG" ]]; then
>"$LOG"
fi

for UC in ${SRV[*]}; do

# Test if server is already in log, if not add it.
if ! grep -q $UC "$LOG" ; then
echo "$UC|0" >> "$LOG"
fi

isup=$(awk -F\| '$1==test {if ($2~/connected/) print "1"; else print "0"}' test="$UC" "$STATUS")

if [[ $isup = 1 ]]; then
#if server is up, add "0" to log file
awk -F\| '$1==test {$2=0}1' OFS=\| test="$UC" "$LOG" > tmp && mv tmp "$LOG"
else
#if server is down for first time update log file
if [[ $(awk -F\| '$1==test {print ($2==0?0:1)}' test="$UC" "$LOG") = 0 ]]; then
awk -F\| '$1==test {$2=date}1' OFS=\| test="$UC" date="$(date +"%Y/%m/%d %T")" "$LOG" > tmp && mv tmp "$LOG"
fi

fi

done

STATUS 是包含服务信息的文件。
LOG 是它写入状态的文件,它看起来像这样:

SR1|0
SR2|2014/05/12 20:25:05
SR3|0

如果它的 0 正常运行。下降时的日期显示

SRV 数组不是这样的,它是从文件中读取的服务器的动态数量。
我刚刚添加了三个服务器以查看程序的外观。


所以程序是这样的:
测试 LOG 文件是否存在,如果不存在则创建一个空文件。

然后对于 SRV 中的每个服务器:
查看它是否在LOG 文件中,如果不在,则添加一个0,服务器启动。
然后在STATUS文件中查看是否连接成功

如果已连接,请将LOG 文件中的服务器标志设置为0
如果未连接,请将 LOG 文件中的服务器标志设置为日期,
但前提是它的 0 之前,以防止更新日期。

正如您在 awk 部分看到的那样:

$1==test {$2=0}1

它为每个服务器写入整个LOG 文件,所以对于许多服务器,它会多次写入LOG 文件。而且不仅仅是每次运行脚本一次。

最佳答案

您所要做的就是:从 for 循环中,删除所有 重定向,以便每个命令都写入标准输出。然后,用

重定向整个 for 循环
for UC in ${SRV[*]}; do
:
done >> "$LOG"

瞧,日志文件只打开一次。

此外,我不担心从循环内部重新写入日志文件。我只是写所有数据,然后过滤掉你不想要的行。您需要提供该过滤的详细信息。

关于bash - 需要简化更新文件,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/23650227/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com