前言
最近遇到一个问题:申请到了学校的高性能服务器,但是很多软件没法自己安装,只能通过在Lab服务器上面跑完软件的分析,再转移到高性能上面运行自己写好的程序(因为Lab的服务器用的人太多,负载太高)。
那么问题就来了,如果我想可以半自动的把流程走完,要如何操作,也就是在Linux下如何通过ssh到其他机器然后执行命令?
配置
比如Lab服务器`lunar@10.192.176.2`,高性能服务器`lunar@10.128.28.4`;
1. 在上面几台机器上分别配置用户ssh等效性连接。(注意:在所有机器上都要执行下面的操作)
首先在高性能服务器上面:cd ~ && ssh-keygen && ssh-copy-id -i .ssh/id_rsa.pub lunar@10.192.176.2
再返回到Lab服务器:cd ~ && ssh-keygen && ssh-copy-id -i .ssh/id_rsa.pub lunar@10.128.28.4
SSH等效性连接提供了一种在集群中其他主机上复制文件和执行程序时不需要口令提示的安全方式。
2. 配置好SSH等效性连接后,在这几台机器上复制文件和执行程序就不需要口令了,ssh过去也不需要口令。
那么如何从Lab服务器上面转到高性能服务器的特定目录再运行高性能那边的程序`run.next.sh`呢?ssh lunar@10.128.28.4 "cd /special_path/; nohup run.next.sh &> run.next.sh.log &"
可以把这一行命令写入到一个shell脚本:`runatHP.sh`
注意:当多于两个命令时,一定要把所有命令以分号的方式写在双引号里面。
3. 但是Lab服务器的流程`run.first.sh`还在运行中,需要编写一个实时检测该程序是否完成的shell脚本`detect.pid.sh`:vi detect.pid.sh
#!/bin/sh
# ----------------------------
# Subroutine to echo the usage
# ----------------------------
usage()
{
echo "USAGE: sh $0 [first-pid] [next-script]"
exit 1
}
[ $# -eq 0 ] && usage
while :
do
if kill -0 ${1}
then
sleep 120
else
nohup /bin/sh ${2} &> ${2}.log &
break
fi
done
保存到`detect.pid.sh`文件,然后`chmod +x detect.pid.sh`;
接下来我们需要知道`run.first.sh`的运行PID:ps x | grep 'run.first.sh' | grep -v grep | awk '{print $1}'
57101
4. 使用在LAB服务器上写好的`detect.pid.sh`来检测`run.first.sh`的运行状态,一旦运行完则通过`runatHP.sh`来运行高性能上的`run.next.sh`:nohup /path-lab/detect.pid.sh 57101 runatHP.sh &
后台运行检测脚本就可以去做其他的事情了;