
Estou usando um código Fortran antigo que usa algum tratamento de memória peculiar. Para resumir a longa história, ele é executado na minha máquina local, mas falha na máquina remota. É por isso que gostaria de ssh
executar o código em meu computador local e copiar os resultados de volta para o cluster em que estou executando meus cálculos.
Já encontrei exatamente a mesma pergunta neste fórum:
EDITAR #1
Após o comentário do @Anthon, corrigi meu script, infelizmente ocorreu novo erro.OBSERVAÇÃO:Estou usando chaves ssh, portanto nenhuma senha é necessária.
Meu novo roteiro:#! /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"
Meu problema é que run.sh
um script mestre chama outros scripts de shell e eles não são executados corretamente. Recebo a seguinte mensagem:
/home/run_dir_script/run.sh: linha 59: /home/run_dir_script/merge_tabs.sh: Arquivo ou diretório inexistente
Exemplo mínimo:
Aqui está um exemplo condensado do que estou fazendo
Exemplorun.sh
#! /usr/bin/bash
pwd
echo "Run the code"
./HELLO_WORLD
O script acima é executado por
ssh usr@machene_wehere_i_run_the_code /home/run_dir_script/run.sh
Para completar o código fortran ./HELLO_WORLD
program main
write(*,*) 'Hello World'
stop
end
Compile com gfortran -o HELLO_WORLD hello_world.F90
E aqui está a saída
/home/run_dir_script/
Run the code
/home/run_dir_script/test.sh: line 5: ./home/HELLO_WORLD: No such file or directory
Observação:
The following will run `HELLO_WORLD` on the remote machine
ssh usr@machene_wehere_i_run_the_code /home/run_dir_script/HELLO_WORLD
Portanto, chamar o código diretamente funciona bem. Chamá-lo por meio do script falha.
Solução possível:
A razão pela qual isso falha é devido ao fato de que após o ssh eu pouso no arquivo $HOME
.
Portanto, antes de executar o script, preciso cd
ir ao diretório apropriado. O método correto, além de fornecer o caminho absoluto, é:
Outra observação útil é que todas as variáveis de .bashrc são indefinidas. Portanto é preciso ter cuidado.
usr@machene_wehere_i_run_the_code "cd /home/run_dir_script ; run.sh"
Então isso de alguma forma funciona
Responder1
Eu tentaria colocar os argumentos ssh
entre aspas duplas.
ssh usr@machene_wehere_i_run_the_code "/home/run_dir_script/run.sh inp 8"
Também com base nessa mensagem de erro, parece que o script não consegue encontrar este script:
/home/run_dir_script/run.sh: linha 59: /home/run_dir_script/merge_tabs.sh: Arquivo ou diretório inexistente
Além disso, eu impediria que isso scp
acontecesse se ssh
não retornasse um status de sucesso:
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
O problema principal é que há um problema com o seu script ao localizar os scripts subordinados no sistema remoto. Pode haver variáveis que são definidas quando você faz login e executa seu script, versus quando você faz login ssh
e executa seu script.
Para estes, eu compararia o resultado do env
uso de ambos os métodos.
Responder2
Não há nada depois na linha seguinte ssh -X usr@machene_wehere_i_run_the_code
no seu código. Então esse comando faz login machene_wehere_i_run_the_code
e não faz nada.
No exemplo de chamada ssh na resposta aceita da pergunta que você cita, há um parâmetro extra:
ssh user@host path_to_script
e path_to_script
está faltando no seu.