ssh@host:""ssh スイッチで他のマシンで複数のコマンドを実行する。stdin はターミナルではないので、擬似ターミナルは割り当てられない。
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'
関連
-
エラー解決:bash: nvm: コマンドが見つかりません。
-
Linuxシェルプログラミングにおける不正な置換の解決法
-
ubuntu installationEnvironmentError: mysql_config not found エラー
-
エラー: 'for' ループの初期宣言は C99 モードでのみ許可されます。
-
解決済み gpg: 有効な OpenPGP データが見つかりません。
-
BadPaddingException:与えられた最終ブロックが適切にパディングされていない
-
Haproxy の「502 Bad Gateway サーバーが無効または不完全な応答を返しました」を解決する。
-
CentOS 7のインストールとDockerの展開
-
linuxのセグメンテーション障害
-
mysqlbinlog: 不明な変数 'default-character-set=utf8mb4' の問題を解決する。
最新
-
nginxです。[emerg] 0.0.0.0:80 への bind() に失敗しました (98: アドレスは既に使用中です)
-
htmlページでギリシャ文字を使うには
-
ピュアhtml+cssでの要素読み込み効果
-
純粋なhtml + cssで五輪を実現するサンプルコード
-
ナビゲーションバー・ドロップダウンメニューのHTML+CSSサンプルコード
-
タイピング効果を実現するピュアhtml+css
-
htmlの選択ボックスのプレースホルダー作成に関する質問
-
html css3 伸縮しない 画像表示効果
-
トップナビゲーションバーメニュー作成用HTML+CSS
-
html+css 実装 サイバーパンク風ボタン
おすすめ
-
PIL IOErrorの解決策:画像ファイル 'images/1212.jpg' を特定できない。
-
ソリューションが不完全なタイプである
-
ImportError: libSM.so.6: cannot open shared object file: そのようなファイルやディレクトリはありません 解決方法
-
linux環境:警告。ISO C++は文字列定数を'char*'に変換することを禁じている[-Write-strings]。
-
Python3.xでprintを使用する際のエラー(SyntaxError: Missing parenthes in call to 'print')に対する解決策を公開しました。
-
Werror=unused-but-set-variableエラーの解決法
-
Ubuntu 20.04 プロキシ設定
-
コンパイル時の警告をなくす(Warning)
-
ansibleのitemsとwith_itemsを理解する
-
実行中のデータノードが1つあり、この操作で除外されるノードはありません。 エラー