zoukankan      html  css  js  c++  java
  • Linux服务器之间免密同步文件、重启R服务

    机器:ML-01/ML-02/ML-03

    需求:

      1、在ML-01上自动将文件同步至ML-02/ML-03

      2、在ML-01上通过脚本重启ML-02/ML-03上的R服务

    说明:以下示例中,ML-02的ip地址以“ml02ip”代替,注意替换


    一、配置免密登陆

    在ML-01上生成密钥文件:

    先用命令 sudo su -  切换至root用户:

    sudo su -  
    

    使用ssh-keygen生成密钥文件和私钥文件:

    ssh-keygen -t rsa  
    

    其中rsa为一种加密方式,另一种为dsa

    这时,服务器会提醒你输入密钥文件的文件名,默认为/root/.ssh/id_rsa

    直接回车,服务器会提醒你输入密码。如果想以后通过该密钥在两台服务器这间通信时,不需要再输入密码的话,这个时候,就不用输入任务字符,直接回车就好!

    系统会再确认一下密码,仍然回车。这样就在/root/.ssh/目录下,生成了id_rsa.pub和id_rsa两上文件。

    将ML-01的公钥上传至ML-02/ML-03,以ML-02为例:

    由于ML-02的root密码未知,所以先同步至ML-02的一个临时目录,再复制到root目录下。

    在ML-01上执行shell脚本,将id_rsa.pub上传至ML-02(ip:ml02ip)的/tmp目录下,重命名为authorized_keys:

    scp -r /root/.ssh/id_rsa.pub teld@ml02ip:/tmp/authorized_keys  
    

    输入ML-02的密码,待文件传输完成后即可。  

    登陆ML-02机器,sudo su - 切换root用户,然后将 /tmp/authorized_keys 文件复制到/root/.ssh 目录下(在ML-02上执行):

    sudo su - 
    mkdir /root/.ssh
    cp  /tmp/authorized_keys /root/.ssh

    测试:  

    将ML-01上的/tmp/test.txt复制到ML-02的/tmp目录下,在ML-01上执行脚本:

    scp -r /tmp/test.txt root@ml02ip:/tmp
    

    二、非root用户提供权限执行数据同步操作

    说明:R集群的模型同步和服务重启都是通过自动化服务调用脚本来执行的。自动化服务只有非root用户权限,为了在脚本中自动提升权限,需要输入非root用户的密码,因此用到expect。

    首先在ML-01上安装 expect:

    yum install tcl
    yum install expect  

    编写由自动化服务调用的脚本:restart文件,vim restart 如下编辑

    #!/usr/bin/expect
    
    set timeout 200
    set password "mypassword"
    
    spawn sudo su -
    expect "password for"
    send "$password
    "
    expect "Last login"
    send "/var/FastRWeb/web.R/train/restart_implement
    "
    expect "Rserv started in daemon mode"
    send "/var/FastRWeb/web.R/train/rclusteroperation
    "
    expect "Pseudo-terminal"
    send "exit
    "
    expect "logout"
    send "exit
    "
    interact  

    注意:开头第一行必须是#!/usr/bin/expect

    编写restart调用的restart_implement文件:restart_implement主要是同步ML-01的模型并重启ML-01的R服务,此处略

    编写restart调用的rclusteroperation文件:rclusteroperation主要是同步ML-01的模型并重启ML-01的R服务,见步骤三

      


    三、配置自动化脚本:在ML-01上将训练模型同步至ML-02/ML-03,并重启R服务(以ML-02为例)

    (集群新增机器时,按此配置即可) 

    在ML-02上增加重启R服务的脚本文件( /var/FastRWeb/web.R/masterinvoke/restartr ):

    sudo su -
    mkdir /var/FastRWeb/web.R/masterinvoke
    mkdir /var/FastRWeb/web.R/masterinvoke/log
    cd /var/FastRWeb/web.R/masterinvoke
    vim restartr

    在ML-02上设置 /var/FastRWeb/web.R/masterinvoke/restartr 的内容 :

    #!/bin/bash
    curDate=`date  +%Y-%m-%d`
    logFileName="/var/FastRWeb/web.R/masterinvoke/log/${curDate}.txt"
    echo -e "
     ------------------------------------------------------------------------------- " >> ${logFileName}
    echo ${logFileName}
    echo -e "
     开始重启R服务 " >> ${logFileName}
    echo `date +%Y-%m-%d/%H:%M:%S`  >> ${logFileName}
    
    curTime=`date  +%Y-%m-%d-%H-%M-%S`
    
    echo "获取服务进程ID"  >> ${logFileName}
    
    var=`lsof -i :8888 -sTCP:LISTEN`
    echo ${var}  >> ${logFileName}
    var2="${var#*Rserve}"
    echo ${var2}  >> ${logFileName}
    varport="${var2%root*}"
    echo ${varport}  >> ${logFileName}
    echo "begin stop R server"  >> ${logFileName}
    kill -9 ${varport}
    echo "end stop R server"  >> ${logFileName}
    echo "begin start R server"  >> ${logFileName}
    /var/FastRWeb/code/start
    echo "end start R server"   >> ${logFileName}
    
    echo `date +%Y-%m-%d/%H:%M:%S`  >> ${logFileName}
    echo  " 重启R服务成功 " >> ${logFileName}
    echo "startRseverOK"
    echo -e "
     ------------------------------------------------------------------------------- " >> ${logFileName}
    

    在ML-02上设置 /var/FastRWeb/web.R/masterinvoke/restartr的执行权限

    chmod 755 /var/FastRWeb/web.R/masterinvoke/restartr
    

      

    在ML-01修改/var/FastWebR/web.R/train/rclusteroperation文件,增加脚本:


    echo "开始向ML-02同步模型 "
    scp -r /var/FastRWeb/web.R/c50.rda root@ml02ip:/var/FastRWeb/web.R/c50.rda
    scp -r /var/FastRWeb/web.R/NewsTextClassification.rda root@ml02ip:/var/FastRWeb/web.R/NewsTextClassification.rda
    echo "向ML-02同步模型成功 "
     

    echo "开始重启ML-02 R服务 "
    ssh root@ml02ip << eeooff
    nohup /var/FastRWeb/web.R/masterinvoke/restartr >/dev/null 2>&1 &  
    exit
    eeooff
    echo " 重启ML-02 R服务成功

    注意:nohup /var/FastRWeb/web.R/masterinvoke/restartr >/dev/null 2>&1 &      必须这么写,其它的各种写法,要么ssh进程不能自动关闭,要么远程执行后进程等待。


    参考1:免密传输文件

    https://buddie.iteye.com/blog/1988730

    在两台Linux服务器之间传输文件夹。

    Linux命令选择是SCP,SCP命令的基本格式如下:

    scp -p port user@serverip:/home/user/filename /home/user/filename  

     以上端口p 为参数,port 端口;

    user 为远程服务器的用户;

    serverip 为远程服务器ip或者域名;

    第一个/home/user/filename 为要传输的远程服务器的文件名;

    第二个/home/user/filename 为本地服务服务器的文件名。

    如果端口是默认,则可省略-p port;如果传传输的为文件夹,则要加-r参数。如下所示:

    scp -r user@serverip:/home/user/folder /home/user/folder  

     以上是从serverip这台服务器上下载文件夹/home/user/folder到本服务器的/home/user/folder中。

    如果要从本地上传文件夹到远程服务器,那就是下面的类似指令:

     scp -r /home/user/folder user@serverip:/home/user/folder  

     这样就实现了两台Linux服务器之间的文件、文件夹传输。

    可是每次都要输入密码验证,很麻烦。

    为了不用每次输入密码验证,需要在两个服务器这间建立互信通信。

    首先,使用ssh-keygen生成密钥文件和私钥文件

     ssh-keygen -t rsa  

     其中rsa为一种加密方式,另一种为dsa

    这时,服务器会提醒你输入密钥文件的文件名,默认为/root/.ssh/id_rsa

    直接回车

    这时,服务器会提醒你输入密码。如果想以后通过该密钥在两台服务器这间通信时,不需要再输入密码的话,这个时候,就不用输入任务字符,直接回车就好!

    系统会再确认一下密码,仍然回车。

    这样就在/root/.ssh/目录下,生成了id_rsa.pub和id_rsa两上文件。

    接下来,就要将id_rsa.pub文件上传到目标服务器的/root/.ssh/目录下,重命名为authorized_keys

    scp -r /root/.ssh/id_rsa.pub user@serverip:/root/.ssh/authorized_keys  

    这时,输入目标服务器的密码,待文件传输完成后即可。

    如果目标服务器上,已经存在了authorized_keys,那么就将id_rsa.pub中的内容追加到目标服务器的authorized_keys文件中

    cat /root/.ssh/id_rsa.pub | ssh user@serverip 'cat >> /root/.ssh/authorized_keys'   

    此时,再使用scp在这两台服务器这间传输文件,只有第一次,需要输入密码外,以后就再也不用输入密码验证了。


    参考:SSH远程执行命令


    参考2:https://blog.csdn.net/dai451954706/article/details/37503793

    #!/bin/bash
     
    cd /tmp
    i=1
    #ip.txt保存主机列表,第三列为IP,第二列为主机名,第一列为主机所在地址
    cat ip.txt|while read line
    do
        IP=`echo $line|awk '{print $3}'`
        addr=`echo $line|awk '{print $1}'`
        echo "i=$i  $addr  IP = $IP"
        scp -o "StrictHostKeyChecking no" /root/tt/greplog.sh root@"$IP":/tmp/
        ssh root@${IP}<<EOF   #脸上主机,执行多条命令,前提是要配置好密钥登录
            chmod a+x /tmp/greplog.sh
            nohup /tmp/greplog.sh > myout.file 2>&1 &   #放到后台执行
            exit
    EOF
        i=` expr $i + 1 `
    done
    exit 0
    --------------------- 
    作者:Oooover 
    来源:CSDN 
    原文:https://blog.csdn.net/dai451954706/article/details/37503793 
    版权声明:本文为博主原创文章,转载请附上博文链接!
    

     

    参考3:http://www.cnblogs.com/vijayfly/p/6264744.html


    遇到问题
    使用ssh root@172.16.146.20 '/usr/local/luly/loadavg.sh 2 2 &'执行
    本机没有即时退出,占用ssh连接
    本意是发送命令到远程机执行,本机发送后直接退出

    尝试:
    1、增加nohup,效果相同:
    ssh root@172.16.146.20 'nohup /usr/local/luly/loadavg.sh 2 2 &'

    2、增加网络上说的-t 、 -tt 参数,也没有用
    ssh -t root@172.16.146.20 '/usr/local/luly/loadavg.sh 2 2 &'
    ssh -tt root@172.16.146.20 '/usr/local/luly/loadavg.sh 2 2 &'

    3、去掉引号,本机也在后台运行,占用ssh连接,必须手动kill才行,非我所想
    ssh root@172.16.146.20 /usr/local/luly/loadavg.sh 2 2 &

    最终解决方案:
    增加>/dev/null 2>&1,本机即时退出,没有进程遗留,远程后台执行脚本,达到目的
    ssh root@172.16.146.20 '/usr/local/luly/loadavg.sh 2 2 >/dev/null 2>&1 &'

     

    参考4:https://www.cnblogs.com/softidea/p/6855045.html


    Linux Shell远程执行命令(命令行与脚本方式)

     

    shell远程执行:

      经常需要远程到其他节点上执行一些shell命令,如果分别ssh到每台主机上再去执行很麻烦,因此能有个集中管理的方式就好了。一下介绍两种shell命令远程执行的方法。

    前提条件:

      配置ssh免密码登陆

    对于简单的命令:

      如果是简单执行几个命令,则:

    ssh user@remoteNode "cd /home ; ls"

      基本能完成常用的对于远程节点的管理了,几个注意的点:

    1. 双引号,必须有。如果不加双引号,第二个ls命令在本地执行
    2. 分号,两个命令之间用分号隔开

    对于脚本的方式:

      有些远程执行的命令内容较多,单一命令无法完成,考虑脚本方式实现:

    复制代码
    #!/bin/bash
    ssh user@remoteNode > /dev/null 2>&1 << eeooff
    cd /home
    touch abcdefg.txt
    exit
    eeooff
    echo done!
    复制代码

    远程执行的内容在“<< eeooff ” 至“ eeooff ”之间,在远程机器上的操作就位于其中,注意的点:

    1. << eeooff,ssh后直到遇到eeooff这样的内容结束,eeooff可以随便修改成其他形式。
    2. 重定向目的在于不显示远程的输出了
    3. 在结束前,加exit退出远程节点

    参考:expect的安装与使用


     参考5:https://www.cnblogs.com/meitian/p/5134797.html


    背景:在远程文件下载时,需要输入对方的服务器密码,shell不支持交互输入内容,可以用下面两种方式实现
     
    一.在shell脚本中嵌入expect来实现密码输入
    expect是一个自动交互功能的工具。expect是开了一个子进程,通过spawn来执行shell脚本,监测到脚本的返回结果,通过expect判断要进行的交互输入内容(send)
    1.安装expect 
    需要先安装tcl:apt-get install tcl
    apt-get install expect
     
    2.expect使用
    2.1一个简单的输入密码操作
    #!/usr/bin/expect
    set timeout 100
    set password "123456"
    spawn sudo rm -rf zzlogic
    expect "root123456"
    send "$password "
    interact
    说明:
    第一行#!/usr/bin/expect表示使用expect的shell交互模式
    set是对变量password赋值
    set timeout 100:设置超时时间为100秒,如果要执行的shell命令很长可以设置超时时间长一些。expect超过超时时间没有监测到要找的字符串,则不执行,默认timeout为10秒
    spawn在expect下执行shell脚本
    expect对通过spawn执行的shell脚本的返回进行判断,是否包含“”中的字段
    send:如果expect监测到了包含的字符串,将输入send中的内容, 相当于回车
    interact:退出expect返回终端,可以继续输入,否则将一直在expect不能退出到终端
     
    2.2expect的命令行参数
    [lindex $argv n]获得index为n的参数(index从0开始计算)
    $argc为命令行参数的个数
    [lrange $argv 0 0]表示第一个参数
    [lrange $argv 0 3]表示第1到第3个参数
     
    例如scp_service.sh文件,可以./scp_service.sh -rm来执行,这时是赋值了一个参数
    set option  [lindex $argv 0](获得第一个参数存到变量option中,参数是的index是从0开始计算的)
     
    2.3if...elif...else...
    expect支持if语句,
    if {条件1} {
         条件1执行语句
    } elif {条件2} {
         条件2执行语句
    } else {
         其他情况执行语句
    }
    说明:
    1.if的条件用{}来包含条件
    2.if和后面的{}必须有空格隔开
    3.两个花括号之间必须有空格隔开,比如if {} {},否则会报错 expect:extra characters after close-brace
    3.使用{来衔接下一行,所以if的条件后需要加左花括号{
    4.else不能单独放一行,所以else要跟在}后面
    2.4 expect {},多行期望,匹配到哪条执行哪条
    背景:有时执行shell后预期结果是不固定的,有可能是询问是yes/no,有可能是去输入密码,所以可以用expect{}
    花括号内放多行语句,从上至下匹配,匹配到哪个expect执行哪句。
     
    3.shell中调用expect来实现登录
    我是通过在shell脚本中执行expect脚本的方式来实现的。当然可以将shell中定义的一些变量传递给expect脚本作为参数输入。可以见我下图调用的一个例子
     
    说明:经过这次尝试些expect,给我的感觉是expect对格式的要求比较高,比如花括号之间必须有空格啊之类的,所以如果有报错,大家可以仔细观察一下是不是语法格式错误了。
     
  • 相关阅读:
    mvc Controller类介绍
    Mvc全局过滤器与Action排除
    MVC项目实践,在三层架构下实现SportsStore-03,Ninject控制器工厂等
    EF查询数据库框架的搭建
    MVC项目实践,在三层架构下实现SportsStore-01,EF Code First建模、DAL层等
    BootstrapTable与KnockoutJS相结合实现增删改查功能
    JSON详解
    Asp.net管道模型(管线模型)
    NET/ASP.NET MVC Controller 控制器(一:深入解析控制器运行原理)
    .NET/ASP.NET Routing路由(深入解析路由系统架构原理)
  • 原文地址:https://www.cnblogs.com/xianhan/p/10256561.html
Copyright © 2011-2022 走看看