搜索有关监控MongoDB某些功能的方法我发现了一个脚本来检查MongoDB中replicaSet的状态。脚本以bash完成。
last_oplog_date=`/usr/local/bin/mongo --eval "db.printReplicationInfo()" | grep 'oplog last event time' | awk 'BEGIN { FS = "time:" } ; { print $2 }'`
last_oplog_timestamp=`date -j -f ' %a %b %d %Y %H:%M:%S %Z%z (%Z)' "$last_oplog_date" +%s`
lag=0
IFS="
"
for slave_replication_date in `/usr/local/bin/mongo --eval "db.printSlaveReplicationInfo()" | grep 'syncedTo' | awk 'BEGIN { FS = "syncedTo:" } ; { print $2 }'`
do
slave_replication_timestamp=`date -j -f ' %a %b %d %Y %H:%M:%S %Z%z (%Z)' "$slave_replication_date" +%s`
lag_seconds=`expr $last_oplog_timestamp - $slave_replication_timestamp`
if [ $lag_seconds -gt $lag ]; then
lag=$lag_seconds
fi
done
exit $lag
此代码的作者已经警告过,如果是用FreeBSD编写的。我试图在Linux中执行它并发生一些奇怪的事情。首先,我改变了用
修改数据的方式date -d "$var" "+%s"
脚本的第一部分没有循环。所以他得到了MongoDB的oplog日期并转入时间戳。也适用于我,但......在第二部分,他做了一个for循环来获取一些信息,然后以相同的方式转换它。这是崩溃的地方。
date: invalid date « Tue May 10 2016 13:49:31 GMT+0200 (CEST)\n Tue May 10 2016 13:49:31 GMT+0200 (CEST)»
您是否注意到该脚本附加到第一次结束日期?我试图用tr -d' \ n'删除它。但也没有工作。
所以我无法进入脚本的最后一部分,因为\ n此时正在阻止我,错误为"无效日期"
我知道是否有一些非常容易修复的东西但是......我花了几个小时试图修复它而没有成功。有点沮丧。
UPDATE1:
我试图避免循环,但仍然没有成功。如果我在bash中运行mongo命令,我会得到两个数据:
/usr/bin/mongo --eval "db.printSlaveReplicationInfo()" | grep 'syncedTo' | awk 'BEGIN { FS = "syncedTo:" } ; { print $2 }'`
Output:
Tue May 10 2016 13:49:31 GMT+0200 (CEST)
Tue May 10 2016 13:49:31 GMT+0200 (CEST)
然后我尝试进入脚本并设法进入转义\ n
的元素数组IFS='\n' read -r -a array <<< "$var1"
echo "${array[0]}"
echo "${array[1]}"
Tue May 10 2016 13:49:31 GMT+0200 (CEST)
最后一个数组不显示任何内容:(
谢谢!
答案 0 :(得分:0)
我终于设法解决了这个问题。
IFS=""
var1=`/usr/bin/mongo --eval "db.printSlaveReplicationInfo()" | grep 'syncedTo' | awk 'BEGIN { FS = "syncedTo:" } ; { print $2 }'`
oldIFS="$IFS"
IFS='
'
IFS=${IFS:0:1} # this is useful to format your code with tabs
lines=( $var1 )
IFS="$oldIFS"
for slave_replication_date in "${lines[@]}"
do
slave_replication_timestamp=`date -d "$slave_replication_date" "+%s"`
lag_seconds=`expr $last_oplog_timestamp - $slave_replication_timestamp`
if [ $lag_seconds -gt $lag ]; then
lag=$lag_seconds
exit 1
fi
done
希望它可以帮助有同样问题的人。
由于