
Estoy usando un código antiguo de Fortran que utiliza un manejo de memoria peculiar. Para abreviar la historia, se ejecuta en mi máquina local pero falla en la remota. Es por eso que me gustaría ssh
ejecutar el código en mi computadora local y copiar los resultados al clúster en el que estoy ejecutando mis cálculos.
Ya encontré exactamente la misma pregunta en este foro:
EDITAR #1
Después del comentario de @Anthon, corregí mi script, desafortunadamente ocurrió un nuevo error.NOTA:Estoy usando claves ssh por lo que no se necesitan contraseñas.
Mi nuevo guión:#! /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"
Mi problema es que run.sh
es un script maestro que llama a otros scripts de Shell y no se ejecutan correctamente. Recibo el siguiente mensaje:
/home/run_dir_script/run.sh: línea 59: /home/run_dir_script/merge_tabs.sh: No existe tal archivo o directorio
Ejemplo mínimo:
Aquí hay un ejemplo condensado de lo que estoy haciendo.
Ejemplorun.sh
#! /usr/bin/bash
pwd
echo "Run the code"
./HELLO_WORLD
El script anterior es ejecutado por
ssh usr@machene_wehere_i_run_the_code /home/run_dir_script/run.sh
Para completar, el código Fortran ./HELLO_WORLD
program main
write(*,*) 'Hello World'
stop
end
Compile con gfortran -o HELLO_WORLD hello_world.F90
Y aquí está la salida.
/home/run_dir_script/
Run the code
/home/run_dir_script/test.sh: line 5: ./home/HELLO_WORLD: No such file or directory
Observación:
The following will run `HELLO_WORLD` on the remote machine
ssh usr@machene_wehere_i_run_the_code /home/run_dir_script/HELLO_WORLD
Entonces llamar al código directamente funciona bien. Llamarlo a través del script falla.
Solución posible:
La razón por la que esto falla se debe al hecho de que después de ssh aterrizo en el archivo $HOME
.
Por lo tanto, antes de ejecutar el script, debo hacerlo cd
en el directorio adecuado. El método correcto, además de dar la ruta absoluta, es:
Otra observación útil es que todas las variables de .bashrc no están definidas. Por eso hay que tener cuidado.
usr@machene_wehere_i_run_the_code "cd /home/run_dir_script ; run.sh"
Entonces esto de alguna manera funciona
Respuesta1
Intentaría poner los argumentos ssh
entre comillas dobles.
ssh usr@machene_wehere_i_run_the_code "/home/run_dir_script/run.sh inp 8"
También según ese mensaje de error, parece que el script no puede encontrar este script:
/home/run_dir_script/run.sh: línea 59: /home/run_dir_script/merge_tabs.sh: No existe tal archivo o directorio
También bloquearía que esto scp
suceda si ssh
no devuelve un estado exitoso:
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
Sin embargo, el problema fundamental es que hay un problema con el script al localizar los scripts subordinados en el sistema remoto. Puede haber variables que se configuran cuando inicia sesión y ejecuta su secuencia de comandos, en comparación con cuando inicia sesión ssh
y ejecuta su secuencia de comandos.
Para estos, compararía el resultado de env
usar ambos métodos.
Respuesta2
No hay nada después en la línea posterior ssh -X usr@machene_wehere_i_run_the_code
de su código. Entonces ese comando inicia sesión machene_wehere_i_run_the_code
y no hace nada.
En el ejemplo de llamada ssh, en la respuesta aceptada de la pregunta que usted cita, hay un parámetro adicional:
ssh user@host path_to_script
y el path_to_script
falta en el tuyo.