複数の異なるリモートRedHatマシンで実行されるWebサービスがあります。サービスを更新したいときはいつでも、バージョン管理デポ(私はperforceを使用)からperlで記述された新しいWebサービスソースコードを同期し、その新しい同期されたperlコードを使用してサービスを再起動します。リモートマシンに1つずつログインし、その一連のコマンドを実行してサービスを1つずつ手動で再起動するのは退屈すぎると思います。そこで、「一度一箇所で、すべてのマシンを更新する」ために、以下のようなbashスクリプトupdate.shを作成しました。このシェルスクリプトをローカルマシンで実行します。しかし、それは機能しないようです。ローカルマシンのコマンドラインからわかるように、最初のコマンド「sudo-uwebservice_username-i」のみを実行します。(以下のコードは、リモートWebサービスの1つを更新する方法のみを示しています。 "
#!/bin/sh
ssh myname@remotehost1 'sudo -u webservice_username -i ; export P4USER=myname; cd dir ; p4 sync ; cd bin ; ./prog --domain=config_file restart ; tail -f ../logs/service.log'
最初のコマンドだけが実行されることがわかっているのはなぜですか?ローカルマシンでsshのパスワードを入力すると、次のように表示されます。
Your environment has been modified. Please check /tmp/webservice.env.
そして、それはただそこで立ち往生しています。私はノーリターンを意味します。
コメント投稿者が提案したように、sshに「-t」を追加しました
#!/bin/sh
ssh -t myname@remotehost1 'sudo -u webservice_username -i ; export P4USER=myname; cd dir ; p4 sync ; cd bin ; ./prog --domain=config_file restart ; tail -f ../logs/service.log'
これにより、ローカルコマンドラインが返されます。しかし、奇妙に思えます。その「dir」にcdできず、「cd:dir:そのようなファイルまたはディレクトリはありません」と表示されます。「p4:コマンドが見つかりません」とも表示されます。したがって、sudo -uコマンドは効果なしで実行され、exportコマンドは効果なしで実行または実行されていないように見えます。
詳細なローカルログファイルは次のとおりです。
Your environment has been modified. Please check /tmp/dir/.env.
bash: line 0: cd: dir: No such file or directory
bash: p4: command not found
bash: line 0: cd: bin: No such file or directory
bash: ./prog: No such file or directory
tail: cannot open `../logs/service.log' for reading: No such file or directory
tail: no files remaining