whileサイクルでsshに遭遇した場合、どのように終了を避けるか


作/訳者:葉金栄(Email:)、出典:http://imysql.cn、転載は作/訳者と出典を明記してください.また、商業用途には使用できません.違反者は必ず追及します.
まず例を見てみましょう.
#!/bin/sh
. /root/.bash_profile
cat /home/yejr/alldb|while read LINE
do
   #  IP   
   IP=`echo $LINE | awk '{print $1}'`
   NU=`echo $LINE | awk '{print $2}' | awk -F '-' '{print $1}'`
   cnt=`ssh root@$IP "mysql -e 'select count(*) from yejr.tbl1'|tail -n 1"`
   echo "$IP $NU $cnt"
done

問題ないように見えますが、実際には、実行時に1回だけループして、whileループを終了しました.なぜですか.
これは、sshが入力端末からデータを読み出す必要があるため、1回目のループ時にsshがreadで読み取ったデータも読み出し、相当に彼に「食べられた」からである.
解決策は、sshの入力端末を指定する3つの方法があります.
ssh -f
-f Requests ssh to go to background just before command execution.  This is useful if ssh is going to ask for
   passwords or passphrases, but the user wants it in the background.  This implies -n.  The recommended way to
   start X11 programs at a remote site is with something like ssh -f host xterm.

または、
ssh -n
-n Redirects stdin from /dev/null (actually, prevents reading from stdin).  This must be used when ssh is run in
   the background.  A common trick is to use this to run X11 programs on a remote machine.  For example, ssh -n
   shadows.cs.hut.fi emacs & will start an emacs on shadows.cs.hut.fi, and the X11 connection will be automati-
   cally forwarded over an encrypted channel.  The ssh program will be put in the background.  (This does not
   work if ssh needs to ask for a password or passphrase; see also the -f option.)

あるいは、sshをバックグラウンドに置く実行する.以下はいくつかの書き方の総合です.
#!/bin/sh
. /root/.bash_profile
cat /home/yejr/alldb|while read LINE
do
   #  IP   
   IP=`echo $LINE | awk '{print $1}'`
   NU=`echo $LINE | awk '{print $2}' | awk -F '-' '{print $1}'`
   #-f
   #cnt=`ssh -f root@$IP "mysql -e 'select count(*) from yejr.tbl1'|tail -n 1"`
   #-n
   #cnt=`ssh -n root@$IP "mysql -e 'select count(*) from yejr.tbl1'|tail -n 1"`
   #   
   #cnt=`ssh root@$IP "mysql -e 'select count(*) from yejr.tbl1'|tail -n 1" &`
   #      
   cnt=`ssh root@$IP "mysql -e 'select count(*) from yejr.tbl1'|tail -n 1" 
  
  
  
  
?
“MySQL ” http://www.imysql.cn/
 

本文は“MySQLを愛します”のブログから出て、転載して作者と連絡してください!