원격 컴퓨터에서 코드를 실행하고 결과를 다시 복사합니다.

원격 컴퓨터에서 코드를 실행하고 결과를 다시 복사합니다.

저는 특별한 메모리 처리를 사용하는 오래된 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당신의 것은 사라졌습니다.

관련 정보