我正在使用一些旧的 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
你的却不见了。