저는 특별한 메모리 처리를 사용하는 오래된 Fortran 코드로 작업하고 있습니다. 간단히 말해서, 내 로컬 컴퓨터에서는 작동하지만 원격 컴퓨터에서는 실패합니다. 이것이 바로 ssh
로컬 컴퓨터에서 코드를 실행하고 계산을 실행 중인 클러스터에 결과를 다시 복사하려는 이유입니다.
이 포럼에서 똑같은 문제를 발견했습니다.
편집 #1
@Anthon의 의견 이후 스크립트를 수정했는데 불행하게도 새로운 오류가 나타났습니다.노트:SSH 키를 사용하고 있으므로 비밀번호가 필요하지 않습니다.
내 새 스크립트:#! /bin/bash
# start form the machine_where_the_resutlst_are_needed
ssh usr@machene_wehere_i_run_the_code /home/run_dir_script/run.sh inp 8
# do the work by running a script. 8 jobs are run by sending them
# to the background,
scp -p usr@machene_wehere_i_run_the_code:/home/run_dir_script/results \
user@machine_where_the_resutlst_are_needed:~/
echo "I am back"
내 문제는 run.sh
기본 스크립트가 다른 쉘 스크립트를 호출하고 제대로 실행되지 않는다는 것입니다. 다음 메시지를 받았습니다.
/home/run_dir_script/run.sh: 59행: /home/run_dir_script/merge_tabs.sh: 해당 파일이나 디렉터리가 없습니다.
최소한의 예:
여기 내가 하고 있는 일에 대한 요약된 예가 있습니다.
예run.sh
#! /usr/bin/bash
pwd
echo "Run the code"
./HELLO_WORLD
위 스크립트는 다음에 의해 생성됩니다.
ssh usr@machene_wehere_i_run_the_code /home/run_dir_script/run.sh
완전성을 위해 포트란 코드 ./HELLO_WORLD
program main
write(*,*) 'Hello World'
stop
end
gfortran -o HELLO_WORLD hello_world.F90을 사용하여 컴파일하십시오.
이것이 출력이다
/home/run_dir_script/
Run the code
/home/run_dir_script/test.sh: line 5: ./home/HELLO_WORLD: No such file or directory
논평:
The following will run `HELLO_WORLD` on the remote machine
ssh usr@machene_wehere_i_run_the_code /home/run_dir_script/HELLO_WORLD
따라서 코드를 직접 호출하면 됩니다. 스크립트를 통해 호출하면 실패합니다.
가능한 해결책:
실패 이유는 ssh 이후에 원격 시스템에 로그인했기 때문입니다 $HOME
.
따라서 스크립트를 실행하기 전에 cd
올바른 디렉토리로 이동 해야 합니다. 절대 경로를 제공하는 것 외에도 올바른 방법은 다음과 같습니다.
또 다른 유용한 참고 사항은 .bashrc의 모든 변수가 정의되지 않았다는 것입니다. 그러므로 사람들은 조심해야 합니다.
usr@machene_wehere_i_run_the_code "cd /home/run_dir_script ; run.sh"
그럼 어느 정도 효과가 있겠지
답변1
ssh
매개변수를 큰따옴표로 묶어 보겠습니다 .
ssh usr@machene_wehere_i_run_the_code "/home/run_dir_script/run.sh inp 8"
또한 해당 오류 메시지에 따르면 스크립트가 다음 스크립트를 찾을 수 없는 것 같습니다.
/home/run_dir_script/run.sh: 59행: /home/run_dir_script/merge_tabs.sh: 해당 파일이나 디렉터리가 없습니다.
scp
또한 성공 상태가 반환되지 않는 경우에도 ssh
이런 일이 발생하지 않도록 방지합니다 .
ssh usr@machene_wehere_i_run_the_code "/home/run_dir_script/run.sh inp 8"
status=$?
if $status; then
scp -p usr@machene_wehere_i_run_the_code:/home/run_dir_script/results \
user@machine_where_the_resutlst_are_needed:~/
fi
그러나 가장 중요한 문제는 스크립트가 원격 시스템에서 슬레이브 스크립트를 찾는 데 문제가 있다는 것입니다. 로그인하여 스크립트를 실행할 때 로그인하여 ssh
스크립트를 실행할 때와 비교하여 일부 변수가 설정될 수 있습니다.
env
이를 위해 두 가지 방법을 모두 사용하여 출력을 비교해 보겠습니다.
답변2
ssh -X usr@machene_wehere_i_run_the_code
코드의 다음 줄에는 아무것도 없습니다. 따라서 이 명령은 machene_wehere_i_run_the_code
로그인 후에는 어떤 작업도 수행하지 않습니다.
인용한 질문에 대한 답변의 ssh 호출 예제에는 추가 매개변수가 있습니다.
ssh user@host path_to_script
그리고 path_to_script
당신의 것은 사라졌습니다.