我的操作系统是CentOS 6.3。 我有一个bash脚本,它获取mysql slave状态,并为用户菜单提供一些操作。当一个动作完成后,它会刷新自己。这是一个简化的例子:
#!/bin/sh
server_status_detect () {
rm -f /root/slave.status
mysql -u${MYSQL_USER} -p${MYSQL_PASS} -e 'show slave status \G' 2>&1 1>/root/slave.status
#some parsing of the file to see if threads are running and so on, done like this
Slave_IO_Running=$(grep '\sSlave_IO_Running:' /root/slave.status | awk '{ print $2 }');
}
themenu () {
clear
server_status_detect
echo -e "Slave running? "$Slave_IO_Running;
echo "Available actions:"
#print actions
}
while true
do
themenu
read answer
case $answer in
e) menu_network_pick;;
d) menu_mount_pick;;
m) menu_master_pick;;
p) menu_repair_replication_pick;;
t) menu_restart_replication_pick;;
r) menu_reboot_pick;;
s) menu_shutdown_pick;;
*) continue;;
esac
done
一切都按预期工作,每次迭代都会重新创建状态文件,它包含实际数据。但是,脚本显示了解析的数据!似乎它不会在每次迭代时解析文件,它只会在第一次执行,然后才会显示它记住的结果。怎么会发生这种情况?
答案 0 :(得分:1)
我尝试使用您的脚本复制该问题,但我没有您遇到的问题。
你可以尝试替换
吗?mysql -u${MYSQL_USER} -p${MYSQL_PASS} -e 'show slave status \G' 2>&1 1>/root/slave.status
Slave_IO_Running=$(grep '\sSlave_IO_Running:' /root/slave.status | awk '{ print $2 }');
与
date > /root/slave.status
Slave_IO_Running=$(grep 'Dec' /root/slave.status | awk '{ print $4 }');
并查看脚本是否显示刷新时间
答案 1 :(得分:0)
对我感到羞耻!我犯了一个愚蠢的错误!
在grepping之前,我有一个if
,它在第二次和并发迭代时变为false,因此greps甚至没有执行,因此变量保持不变。问题关闭,bash并不疯狂,这完全与人类有关:)