我更新了下面的代码,并创建了一个单独的变量用于时间比较。但是,即使在变量后面设置了循环,它仍然没有比较第二个文件。
我正在尝试远程比较多台服务器上的文件的最后更新时间
ssh -q -l user svr "ls -ltr /path/to/file/svr.log | tail -n1"
它返回这个输出,这就是我想要的。
-rwxr-xr-x 1 user user 1658367654 Jul 21 01:40 /path/to/file/svr.log
所以我对其余的服务器也做了同样的操作。我需要统计它们以获得最后修改的日期,并检查最后更新的时间阈值
#!/bin/bash
set -x
s11=$(ssh -q -l user svr1 "find /path/to/log/svr.log -printf '"%T+ %p"' | sort")
s12=$(ssh -q -l user svr2 "find /path/to/log/svr.log -printf '"%T+ %p"' | sort")
s11r=$(echo $s11 | awk '{print $2}')
s12r=$(echo $s12 | awk '{print $2}')
for myservers in $s11r $s12r;
do
OLDTIME=1200 #20 minutes file threshold
FILETIME=$(stat -c %Y "${myservers}")
CURTIME=$(perl -e 'print time')
TIMEDIFF=$(($CURTIME - $FILETIME))
if [[ $TIMEDIFF -gt $OLDTIME ]]; then
echo -e "$myservers: old time"
else
echo "$myservers: all good"
fi
done
输出如下
++ ssh -q -l user svr1 'find /path/to/log/svr.log -printf '\''%T+' '%p'\'' | sort'
+ s11='2022-07-21+03:09:19.3550802140 /path/to/log/svr.log'
++ ssh -q -l user svr2 'find /path/to/log/svr.log -printf '\''%T+' '%p'\'' | sort'
+ s12='2022-07-21+03:25:53.3758441030 /path/to/log/svr.log'
++ echo 2022-07-21+03:09:19.3550802140 /path/to/log/svr.log
++ awk '{print $2}'
+ s11r=/path/to/log/svr.log
++ echo 2022-07-21+03:25:53.3758441030 /path/to/log/svr.log
++ awk '{print $2}'
+ s12r=/path/to/log/svr.log
+ for myservers in '$s11r' '$s12r'
+ OLDTIME=1200
++ stat -c %Y /path/to/log/svr.log
+ FILETIME=1658381370
++ perl -e 'print time'
+ CURTIME=1658381855
+ TIMEDIFF=485
+ [[ 485 -gt 1200 ]]
+ echo '/path/to/log/svr.log: all good'
/path/to/log/svr.log: all good
+ for myservers in '$s11r' '$s12r'
+ OLDTIME=1200
++ stat -c %Y /path/to/log/svr.log
+ FILETIME=1658381370
++ perl -e 'print time'
+ CURTIME=1658381855
+ TIMEDIFF=485
+ [[ 485 -gt 1200 ]]
+ echo '/path/to/log/svr.log: all good'
/path/to/log/svr.log: all good
根据输出,它执行了该作业,但只处理服务器1的日志文件,而忽略服务器2。即使所有服务器都有更新的文件,但它们的大小并不相同。
需要以下方面的帮助
1.如何使其处理所有服务器
1.如果1个文件已更新,如何跳过服务器检查比较
谢谢你,谢谢你
1条答案
按热度按时间6ioyuze21#
以下是此问题的解决方案:
我正在尝试远程比较多台服务器上的文件的最后更新时间
如何
stat
和**修改:**时间我将测试SSHing正在更新的
/var/log/auth.log
文件。脚本
示例输出
如果我们交换主机
示例输出
注记
find
不用于对文件进行查询:find /path/to/log/svr.log
mapfile -t array_name < <(your-cmd)
find -printf
:-printf '%T+ %p\n'
-缺少\n
换行符更干净的方式
示例输出
如果有多个单个文件(多个文件)
示例输出