1. ホーム
  2. Qt

ssh@host:""ssh スイッチで他のマシンで複数のコマンドを実行する。stdin はターミナルではないので、擬似ターミナルは割り当てられない。

2022-01-22 21:45:57
<パス

1. 背景 シェルスクリプトはマスターマシンでkafka startコマンドを実行し、他のマシンもプロセスを開始します。

以前のスクリプトは、実行するたびに固まり、コマンドラインに戻らなくなった。

回避策

最初の1枚

#/bin/bash
KAFKA_HOME=/opt/kafka
source /opt/wyl/cfg.config
su - hadoop <<EOF
for mm in ${ip[*]};do
    echo "===>"\${mm}: 
    ssh hadoop@\${mm} "cd /opt/kafka ; nohup . /bin/kafka-server-start.sh ${KAFKA_HOME}/config/server.properties > /opt/kafka/kafka.log & [ $? -eq 0 ] & & echo 'kafka is start...' "
done
EOF

ここで、ip は実行する必要のあるすべてのマシンのリストです。
ssh hadoop@${mm} の後には必ず二重引用符を付けてください。
セミコロンでコマンドを区切る場合
/opt/kafka/kafka.log は、ログをこの場所に出力します。

2枚目

ssh root@ip << remotessh
まず、sshを立ち上げる必要があります。sshの設定は前回の記事で見ての通りですが、ここで << remotessh に注意してください。
ここから先は、リモートマシン上でコマンドを実行することになります
cd /tmp/test/
rm -f test.txt
cat test.log | grep 'test' >> test.txt
echo "終了!"

実行完了

exit ### リモートマシンを終了することを忘れないでください。
remotessh ### そして、ここで終わりです、忘れないでください。

 #! /bin/bash
  2 KAFKA_HOME=/opt/kafka
  3 source /opt/wyl/cfg.config
  4 su - hadoop <<EOF
  5 for mm in ${ip[*]};do
  6 echo "===>"\${mm}:
  7 ssh -Tq hadoop@\${mm} << remotessh   
  8 cd /opt/kafka #write top frame, otherwise it will report an error
  9 nohup . /bin/kafka-server-start.sh ${KAFKA_HOME}/config/server.properties > /opt/kafka/kafka.log & #Write it in the top frame, otherwise it will report an error
 10 [ $? -eq 0 ] && echo 'kafka is start...'  # write it in the top frame, otherwise it will report an error
 11 exit  
 12 remotessh
 13 done
 14 EOF

このメソッドがスクリプトを実行した後、次のように出力されます。

Pseudo-terminal will not be allocated because stdin is not a terminal.

文字通りの意味は、stdinはターミナルではないので、擬似ターミナルは割り当てられないということです。
OCDの人は迷惑に感じるはずです。
今回は、パラメータを追加することで解決します。
そこで、標準入力がターミナルでなくても、擬似的にターミナルを割り当てることを強制するために、-ttパラメータを追加する必要があります。
または、-Tqパラメータも追加してください。

結果を実行するために -tt を追加します: ssh -tt hadoop@'xxxx'
各端末に実行されたコマンドが出力される

実行結果に-Tqを追加する ssh -Tq hadoop@'xxxx'