
원격 Linux 시스템에서 수행해야 하는 로컬 우분투 시스템의 일부 단계를 자동화하려고 합니다.
내 쉘 스크립트는 다음과 같습니다.
#!/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에 로그인한 사용자와 달랐습니다(printing을 통해 얻었습니다
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
기본 내보낸 경로 중 하나에 있지 않은 경우 다음과 같습니다.
별명어딘가에기타(예: 일부 원격 서버는 PATH로 내보내지지 않은 마운트된 NFS 폴더에 설치 스크립트를 보관하기를 원함)
함수로 구성된 더 큰 함수/스크립트의 일부인 경우.
env
의 출력을 보고 이를 결정할 수 alias
있습니다 whereis
. 예를 들어 .bashrc
명령의 전체 경로를 언급할 수 있는 다른 내용 이나 생각나는 다른 내용 으로 바꾸십시오 .qlogin
.profile