リモートLinuxシステムで実行する必要があるローカルUbuntuシステムのいくつかの手順を自動化したいと思います。
私のシェルスクリプトは次のとおりです。
#!/bin/sh
ssh XYZ '
qlogin -l cuda=1
'
コレクトを通過しようとすると./fileName.sh
(状態)
bash: line 2: qlogin: command not found
ただし、これを手動で実行すると(つまり、クラスタでsshを実行してこのコマンドを実行した場合)、実行できます。
現在のトラブルシューティング
ローカル端末とリモート端末の両方が bash です。これは私が得た
echo $0
リモートで手動でsshを実行してqloginパスを印刷するとき(passed
which qlogin
)
/opt/ge/bin/lx-amd64/qlogin
ただし、スクリプトを介して同じ操作を実行すると、情報は表示されません。これは、qloginがまだインストールされていないことを意味します。
- 最後に、私がスクリプトを実行したユーザーは、手動でsshにログインしたユーザーとは異なりました(印刷によって取得しました
who
)。
どうすればいいですか?
ベストアンサー1
この場合、必要なものは次のとおりです。
ssh XYZ "qlogin -l cuda=1"
または
ssh XYZ "export TERM=xterm ; qlogin -l cuda=1"
TERM
変数が設定されていないというエラーが発生した場合:
ssh XYZ << 'EOF'
qlogin -l cuda=1
EOF
実行するコマンドが複数ある場合。
最後に、上記の方法が機能しないと確信しているので、この方法も機能します。
ssh XYZ << 'EOF'
shopt -s expand_aliases
source .bashrc
qlogin -l cuda=1
EOF
おそらく気づいたかもしれませんが、もう一方がうまくいかないと、最後のものがうまくいくでしょう。主qlogin
にデフォルトのエクスポートされたパスの1つにない場合は、次のようになります。
ニックネームどこかにその他(たとえば、一部のリモートサーバーは、PATHとしてエクスポートされていないマウントされたNFSフォルダにインストールスクリプトを保持したい)
関数で構成されるより大きな関数/スクリプトの一部である場合。
env
の出力を見て決定することがalias
できますwhereis
。たとえば、.bashrc
コマンドの完全なパスを言及する可能性がある他のものや思い出深いものに置き換えます。qlogin
.profile