Linux下如何通过ssh到其他机器然后执行命令

Perl处理文件

Posted by dulunar on September 9, 2018 | 访问量:

前言

最近遇到一个问题:申请到了学校的高性能服务器,但是很多软件没法自己安装,只能通过在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等效性连接提供了一种在集群中其他主机上复制文件和执行程序时不需要口令提示的安全方式。

  1. 配置好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

注意:当多于两个命令时,一定要把所有命令以分号的方式写在双引号里面。

  1. 但是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
  1. 使用在LAB服务器上写好的detect.pid.sh来检测run.first.sh的运行状态,一旦运行完则通过runatHP.sh来运行高性能上的run.next.sh
nohup /path-lab/detect.pid.sh 57101 runatHP.sh &

后台运行检测脚本就可以去做其他的事情了;