在远程机器上执行代码并将结果复制回来

在远程机器上执行代码并将结果复制回来

我正在使用一些旧的 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主脚本调用其他 shell 脚本,并且它们无法正常运行。我收到以下消息:

/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    

为了完整起见,fortran 代码 ./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

ssh -X usr@machene_wehere_i_run_the_code您的代码中的after 行中没有任何内容。因此该命令登录后machene_wehere_i_run_the_code不执行任何操作。

在您引用的问题的接受答案中的 ssh 调用示例中,有一个额外的参数:

ssh user@host path_to_script

path_to_script你的却不见了。

相关内容