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