脚本输出覆盖旧数据,而不是写入新行

时间:2018-01-11 11:20:42

标签: bash hadoop if-statement cron

我来了一个脚本来检查名称节点状态。当我手动运行时,namenode的状态写入文件,当我再次运行第二次尝试输出时,在旧文件中添加一个新行。但我计划在cron中每15分钟运行一次。但是cron作业会覆盖旧数据,我只能看到上次运行状态。如何通过cron添加新行?

#!/bin/bash   

NOW=$(date +"%m-%d-%Y")
fname=active.$NOW.log
[ ! -f  $fname ] && > /opt/hd/sh/bin/$fname

if [[ $(hdfs haadmin -ns ATcluster -getServiceState nn1) = *active* ]];
then
  echo "`date +"%Y-%m-%d %H:%M:%S"` active NN1" >> /opt/hd/sh/bin/$fname
elif [[ $(hdfs haadmin -ns ATcluster -getServiceState nn2) = *active* ]];
then
  echo "`date +"%Y-%m-%d %H:%M:%S"` active NN2" >> /opt/hd/sh/bin/$fname
else
  echo "`date +"%Y-%m-%d %H:%M:%S"` stopped state" >> /opt/hd/sh/bin/failed.$NOW.log
fi

输出:

cat active.01-1
cat: active.01-1: No such file or directory
[root@hadmat01 bin]# cat active.01-11-2018.log
2018-01-11 06:00:04 active NN1 --> it should write nw output like below through cron job
[root@hadmat01 bin]# cat failed.01-11-2018.log
20180111 00:00:05 stopped state
20180111 00:15:05 stopped state
20180111 00:30:05 stopped state
20180111 00:45:05 stopped state

1 个答案:

答案 0 :(得分:1)

你的问题在于此代码: fname=active.$NOW.log [ ! -f $fname ] && > /opt/hd/sh/bin/$fname

如果此作业从crontab开始 - 检查文件存在于/开始。 我认为位置/active.01-11-2018.log不存在。 所以你把emty字符串放在文件/opt/hd/sh/bin/$fname

您必须为日志目标定义绝对路径,或在cd /opt/hd/sh/bin/部分之前插入字符串if