Выполнить код на удаленной машине и скопировать результаты обратно

Выполнить код на удаленной машине и скопировать результаты обратно

Я использую старый код 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

В вашем коде после строки after ничего нет 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в вашем отсутствует.

Связанный контент