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\n"
expect "Last login"
send "/var/FastRWeb/web.R/train/restart_implement\n"
expect "Rserv started in daemon mode"
send "/var/FastRWeb/web.R/train/rclusteroperation\n"
expect "Pseudo-terminal"
send "exit\n"
expect "logout"
send "exit\n"
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 "\n ------------------------------------------------------------------------------- " >> ${logFileName}
echo ${logFileName}
echo -e "\n 开始重启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 "\n ------------------------------------------------------------------------------- " >> ${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"
基本能完成常用的对于远程节点的管理了,几个注意的点:
- 双引号,必须有。如果不加双引号,第二个ls命令在本地执行
- 分号,两个命令之间用分号隔开
对于脚本的方式:
有些远程执行的命令内容较多,单一命令无法完成,考虑脚本方式实现:

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

远程执行的内容在“<< eeooff ” 至“ eeooff ”之间,在远程机器上的操作就位于其中,注意的点:
- << eeooff,ssh后直到遇到eeooff这样的内容结束,eeooff可以随便修改成其他形式。
- 重定向目的在于不显示远程的输出了
- 在结束前,加exit退出远程节点
参考:expect的安装与使用
参考5:https://www.cnblogs.com/meitian/p/5134797.html
.png)


Linux服务器之间免密同步文件、重启R服务的更多相关文章
- 两台linux服务器之间免密scp,在A机器上向B远程拷贝文件
两台linux服务器之间免密scp,在A机器上向B远程拷贝文件 操作步骤:1.在A机器上,执行ssh-keygen -t rsa,一路按Enter,不需要输入任何内容.(如有提示是否覆盖,可输入y后按 ...
- Linux服务器之间免密登录设置
说明: A为linux服务器a B为linux服务器b 每台linux都有ssh的服务端和客户端,linux下的ssh命令就是一个客户端 我们常用ssh协议来进行登陆或者是文件的拷贝,都需要密码 A要 ...
- 两个linux服务器之间免密登录
服务器A(假设为10.64.104.11) 免密登录服务器B(10.64.104.22) 1.登录服务器A 2.生成公私钥 ssh-keygen -t rsa 3.将生成的.pub文件发送到服务器B上 ...
- SSH远程登录:两台或多台服务器之间免密登录设置
有两台(或多台)同局域网的服务器A:192.168.2.21,B:192.168.2.25.让A,B这两台服务器之间能两两互相免密登录,并且每台服务器都可以自我免密登录(自我免密登录即:ssh loc ...
- window、linux系统与linux服务器之间使用svn同步及自动部署代码的方法
摘要: 在家用PC,在公司用办公电脑对一个项目的代码进行修改时,会遇到代码同步的问题.本文讲解了代码同步及自动部署的解决办法. 实现方法: 1.首先在linux服务器上和linux上安装svn(sud ...
- linux服务器ssh免密登录
环境:两台服务器,Park01.Park02,配置ssh免密登录 在Park01执行:ssh-keygen 然后一直回车 生成节点的公钥和私钥,生成的文件会自动放在/root/.ssh目录下 然后 ...
- 记crt 在windows与linux服务器之间利用ftp进行文件的上传下载
我们首先来熟悉一些相关的命令以及操作: ls #展示linux服务器当前工作目录[你连接sftp时所处的目录]下的所有文件以及文件夹 lcd F:\niki #绑定你在windo ...
- 【原】linux两台服务器之间免密登录方法
搭建集群机器192.168.0.100和192.168.0.200里,需要两台机器中间相互拷贝文件: 方式一:下载192.168.0.100机器文件到本地,再将本地文件拷贝到B机器 方式二:192.1 ...
- Linux服务器SSH免密互访
1.编辑Hosts文件: [root@yqtrack-elk01 /]# vim /etc/hosts
随机推荐
- CSS选择器深入探讨(细节东西)(转)
细节决定成败,越是注重细节方面的东西,那么你完成的作品就越完美. 1.父子选择器(看作组合比较好理解) 父子选择器可以有多级(但是在实际开发中最后不好超过三层) 如:html中文件片段: <!- ...
- MySQL内连接和外连接
INNER JOIN(内连接,或等值连接):获取两个表中字段匹配关系的记录. LEFT JOIN(左连接):获取左表所有记录,即使右表没有对应匹配的记录. RIGHT JOIN(右连接): 与 LEF ...
- BZOJ4977: [[Lydsy1708月赛]跳伞求生
传送门 直接贪心 考虑到 \(n\) 个人的贡献都是 \(a_i\),另外 \(m\) 个人的贡献都是 \(c_i-b_i\) 首先 \(a_i>b_j\) 的限制不好做,所以将 \(a,b\) ...
- GADL针对矢量数据格式转换的实用工具 —— ogr2ogr
最初,因为可爱的学弟请教如何将ESRI Shapefile文件导入Google Earth接触到了Ogr2Ogr.粗略了解之后发现,这小东西功能强大. 谷歌地球支持矢量数据的展示,前提是数据符合KML ...
- JS将秒换成时分秒实现代码 [mark]
将秒换成时分秒的方法有很多,在本文将为大家介绍下,使用js的具体的实现思路,有需要的朋友可以参考下,希望对大家有所帮助 http://www.jb51.net/article/41098.htm fu ...
- 网络I/O模型--04非阻塞模式(解除accept()、 read()方法阻塞)的基础上加入多线程技术
由于应用程序级别并没有使用多线程技术,这就导致了应用程序只能一个一个地对Socket 套接字进行处理.这个 Socket 套接宇没有处理完,就没法处理下一个 Socket 套接字 .针对这个 问题还是 ...
- Android控件显示和隐藏
Android控件都有visibility属性,该属性有三个可能值:visible.invisible.gone.可以通过预设或是Java程序控制这些控件的显示或隐藏. 一.在XML配置文件设置 可见 ...
- 如何在微软Windows平台上打造出你的Linux开发环境(转载)
如何在微软Windows平台上打造出你的Linux开发环境 投递人 itwriter 发布于 2013-12-10 11:18 评论(1) 有348人阅读 原文链接 [收藏] « » 英文原文: ...
- python queue和生产者和消费者模型
queue队列 当必须安全地在多个线程之间交换信息时,队列在线程编程中特别有用. class queue.Queue(maxsize=0) #先入先出 class queue.LifoQueue(ma ...
- Python 面向对象(一)
面向过程编程 (Procedural Programming) Prodcedural programming uses a list of instructions to tell the comp ...