1

私のOSはCentOS 6.3です。mysql スレーブのステータスを取得し、ユーザー メニューにいくつかのアクションを与える bash スクリプトがあります。アクションが行われると、それ自体が更新されます。簡単な例を次に示します。

#!/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

すべてが期待どおりに機能し、ステータスファイルは反復ごとに再作成され、実際のデータが含まれています。しかし、スクリプトは最初に解析されたデータを表示します! 反復ごとにファイルを解析するわけではないようです。最初にのみ実行し、その後は記憶した結果を表示するだけです。どうしてそれが起こり得ますか?

4

2 に答える 2

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 }');

スクリプトが更新された時間を表示するかどうかを確認します

于 2012-12-11T17:24:05.363 に答える
0

恥ずかしい!私は愚かな間違いをしました!

greppingの直前にif、2回目の反復と同時反復でfalseになるaがあったため、grepsは実行されておらず、変数は変更されていません。問題は解決しました、bashはクレイジーではありません、それはすべて人間に関するものです:)

于 2012-12-11T18:23:50.663 に答える