我正在尝试在远程计算机上运行一些计算。基本上我想将一些文件复制到计算机,加载软件,执行计算,然后检索数据。我已经为此创建了无密码连接。以下是我的尝试:
#!/bin/bash
scp ./* username@host:/home/tmp
work=$pwd
ssh username@host
cd /home/tmp
module purge
module load gcc/4.6.0 icc/11.1.075 ifort/11.1.075 compilers-extra mpi-openmpi/1.4.3-icc-11.1 vasp
mpirun -np 20 vasp > out.vasp 2>&1 &
scp ./* username@headnode:$work
该脚本只是复制文件并登录到远程计算机,但不启动任何计算。
答案1
我不太确定你的问题是什么,但我有两条评论太长了:
一旦您登录
host
(第 4 行),您当前的脚本就会停止,并等待您以交互方式执行某些操作 - 只有当您退出时,脚本才会继续执行(这可能不是您想要的)。因此,将要在远程服务器上执行的任何内容放入独立的 shell 脚本中,将其与其余数据一起 scp 并使用
ssh username@host /path/to/my/script
.因此:
#!/bin/bash
# your local script
scp ./inputs* ./do_stuff.sh username@host:/home/tmp
ssh username@host /home/tmp/do_stuff.sh
scp username@host:/home/tmp/outputs* .
#!/bin/bash
# script for remote execution do_stuff.sh
cd /home/tmp
module purge
module load gcc/4.6.0 icc/11.1.075 ifort/11.1.075 compilers-extra mpi-openmpi/1.4.3-icc-11.1 vasp
mpirun -np 20 vasp > out.vasp 2>&1
inputs*
将/替换outputs*
为您需要复制到集群或从集群复制的内容 - 您可能不想复制回输入。请注意,引用 as 的脚本do_stuff.sh
必须标记为可执行。如果即使这样也不起作用(因为您要复制到的文件系统是使用该noexec
选项安装的,请使用ssh username@host bash /home/tmp/do_stuff.sh
。或者您可以将其通过管道传输到远程计算机:
cat do_stuff.sh | ssh username@host bash -
2) 如果您正在运行此程序(看起来确实如此),您可以通过再次运行此程序headnode
来摆脱 scp 连接的一个方向。scp
headnode
答案2
我建议您将脚本放在家里用于远程执行,然后将您的脚本称为,
ssh user@host 'bash -s' < local_script.sh
基本上,从具有无密码访问权限的脚本中,之后ssh username@host
,该脚本不会被执行。这很容易测试。
测试
将这两行放入脚本中,然后尝试从本地计算机运行该脚本。
ssh username@host
hostname
通常,我们期望它会打印远程计算机名称,因为我们已经通过 ssh 连接到了它。但事实并非如此。它只是登录到远程计算机,当您exit
退出远程计算机时,只有它会打印主机名(请务必验证它打印出的主机名,它将打印出本地计算机的主机名)。
现在,正如我所建议的,如果您在当地家里有脚本并将其命名为,
ssh user@host 'bash -s' < local_script.sh
本例中的输出是远程主机名称 (请务必从脚本中删除 ssh 行,因为它现在没用了)。
答案3
基本上,您希望脚本在远程计算机上继续,但这种情况不会发生,它们将在本地计算机上运行。为了实现您想要的目的,您需要通过 ssh 将一系列命令传递到远程计算机。
您可以阅读本指南来了解这个想法:http://www.shellhacks.com/en/Running-Commands-on-a-Remote-Linux-Server-over-SSH