Execute o código na máquina remota e copie os resultados de volta

Execute o código na máquina remota e copie os resultados de volta

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 sshexecutar 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.shum 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 cdir 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 sshentre 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 scpacontecesse se sshnã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 sshe executa seu script.

Para estes, eu compararia o resultado do envuso de ambos os métodos.

Responder2

Não há nada depois na linha seguinte ssh -X usr@machene_wehere_i_run_the_codeno seu código. Então esse comando faz login machene_wehere_i_run_the_codee 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_scriptestá faltando no seu.

informação relacionada