シェルスクリプトを使用してリモートサーバーで実行すると、コマンドが見つかりません。

シェルスクリプトを使用してリモートサーバーで実行すると、コマンドが見つかりません。

リモートLinuxシステムで実行する必要があるローカルUbuntuシステムのいくつかの手順を自動化したいと思います。

私のシェルスクリプトは次のとおりです。

#!/bin/sh

ssh XYZ '

qlogin -l cuda=1

'

コレクトを通過しようとすると./fileName.sh(状態)

bash: line 2: qlogin: command not found

ただし、これを手動で実行すると(つまり、クラスタでsshを実行してこのコマンドを実行した場合)、実行できます。

現在のトラブルシューティング

  1. ローカル端末とリモート端末の両方が bash です。これは私が得たecho $0

  2. リモートで手動でsshを実行してqloginパスを印刷するとき(passed which qlogin

/opt/ge/bin/lx-amd64/qlogin

ただし、スクリプトを介して同じ操作を実行すると、情報は表示されません。これは、qloginがまだインストールされていないことを意味します。

  1. 最後に、私がスクリプトを実行したユーザーは、手動で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

おすすめ記事