这里讲述了,我如何在多节点服务器上开启和关闭 tomoon 量化程序。
由于,各种原因,所以,多节点部署肯定会不断的升级,这里我将同时讲述采用该方案的背景已经可以实现的效果。
版本一
由于预算很小,所以,没有采用 jenkins
等自动化部署方式,而是通过 shell
进行连接远程服务器部署。
由于,跑程序的服务器「目前是一核一G」部署在香港、东京、新加坡等,所以,国内连接的时候不是很通畅,即便是科学之后也是如此。
所以,购买了一个一核0.5G
的香港机器作为跳板机。
首先,跳板机必须和远程服务机进行 ssh
无密码登陆,本地也要和跳板机进行无密码登陆,因为,只有无密码登陆才能执行远程服务器指令。
整个过程是,我本地对跳板机发送指令,然后,跳板机对远程服务器发送指令。
指令主要有
- 上传程序 「
tar
包」
- 解压程序包
- 开始程序
- 停止程序
上传程序
本地
文件 release_all.sh
内容如下
1 2 3 4 5 6 7 8 9 10 11 12 13 14
| #!/bin/bash
rm -rf ./logs/* rm nohup.out rm -rf ./quantify.tar.gz
tar zcvf quantify.tar.gz ./*
scp ./quantify.tar.gz root@跳板机IP:~ rm -rf ./quantify.tar.gz
sleep 1s
ssh root@跳板机IP "cd /root/ ; sh release.sh"
|
这里讲一下
ssh root@跳板机IP "cd /root/ ; sh release.sh"
这句话是连接跳板机,并在跳板机中执行
cd /root/
sh release.sh
跳板机
文件 release.sh
1 2 3 4 5 6
| scp ./quantify.tar.gz root@服务器IP:~/quantify scp -P 8444 ./quantify.tar.gz root@服务器IP:~/quantify scp ./quantify.tar.gz root@服务器IP:~/quantify scp ./quantify.tar.gz root@服务器IP:~/quantify scp ./quantify.tar.gz root@服务器IP:~/quantify rm -rf ./quantify.tar.gz
|
这样就将程序上传到了远程服务器上。
解压程序包
在上面上传这一章节我们还遗留了一个问题
- 如何证明你的新程序已经上传到了服务器上,而不会因为网络原因导致失败?
这就是,解压程序包所要解决的事情。
本地
文件 ready_all.sh
1
| ssh root@跳板机IP "cd /root/ ; sh ready.sh"
|
执行跳板机上的 ready.sh
跳板机
文件 ready.sh
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30
| echo 服务器IP ssh root@服务器IP "cd /root/quantify ; sh ready.sh" echo 服务器IP ssh -p 8444 root@服务器IP "cd /root/quantify ; sh ready.sh" echo 服务器IP ssh root@服务器IP "cd /root/quantify ; sh ready.sh" echo 服务器IP ssh root@服务器IP "cd /root/quantify ; sh ready.sh" echo 服务器IP ssh root@服务器IP "cd /root/quantify ; sh ready.sh" echo "\n" echo 服务器IP echo "\n" ssh 服务器IP "cat /root/quantify/update.txt" echo "\n" echo 服务器IP echo "\n" ssh -p 8444 root@服务器IP "cat /root/quantify/update.txt" echo "\n" echo 服务器IP echo "\n" ssh root@服务器IP "cat /root/quantify/update.txt" echo "\n" echo 服务器IP echo "\n" ssh root@服务器IP "cat /root/quantify/update.txt" echo "\n" echo 服务器IP echo "\n" ssh root@服务器IP "cat /root/quantify/update.txt"
|
首先,跳板机会执行远程服务器上的 ready.sh
文件,内容如下
1 2 3 4
| # 远程服务器上的 ready.sh 内容
tar zxvf quantify.tar.gz sleep 1s
|
然后,输出
ssh root@服务器IP "cat /root/quantify/update.txt"
我每次上传都会更新 update.txt
里面的内容,如何,我正常上传,并且正常解压后,我本地展示的远程内容,应该是我更新后的内容。
这样,比照,就会发现是否成功执行。
开始程序
本地
文件 start_all.sh
1
| ssh root@跳板机IP "cd /root/ ; sh start.sh"
|
跳板机
文件 start.sh
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15
| echo 服务器IP ssh root@服务器IP "sh quantify.sh"
echo 服务器IP ssh -p 8444 root@服务器IP "sh quantify.sh"
echo 服务器IP ssh root@服务器IP "sh quantify.sh"
echo 服务器IP ssh root@服务器IP "sh quantify.sh"
echo 服务器IP ssh root@服务器IP "sh quantify.sh"
|
远程服务器
文件 quantify.sh
1 2 3
| rm -rf logs rm nohup.out nohup python3.7 /root/quantify/quantify.py --account 0 --ip *** >/dev/null 2>&1 &
|
本地和跳板机都没啥好说的,这里说一下远程服务器上的指令。
首先,我的程序是有 log
输出的,所以,我并不希望输入到 nohup.out
所以,在后面加了
>/dev/null 2
如果不加这个,必须要按一下 ctrl + c
这个是非常不友好的,说的比较抽象,可以在本地试一下。
另外,关于是否成功开始,我使用的是钉钉通知。
停止程序
这里我们必须解决,本地执行脚本的时候,检测服务器是否真的停止了程序。
本地
文件 stop_all.sh
1
| ssh root@跳板机IP "cd /root/ ; sh stop.sh"
|
跳板机
文件 stop.sh
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21
| ssh root@服务器IP "cd ~/quantify ; sh stop.sh" ssh -p 8444 root@服务器IP "cd ~/quantify ; sh stop.sh" ssh root@服务器IP "cd ~/quantify ; sh stop.sh" ssh root@服务器IP "cd ~/quantify ; sh stop.sh" ssh root@服务器IP "cd ~/quantify ; sh stop.sh"
sleep 3s echo 服务器IP echo `ssh root@服务器IP "ps aux | grep python | grep quantify"` sleep 1s echo 服务器IP echo `ssh -p 8444 root@服务器IP "ps aux | grep python | grep quantify"` sleep 1s echo 服务器IP echo `ssh root@服务器IP "ps aux | grep python | grep quantify"` sleep 1s echo 服务器IP echo `ssh root@服务器IP "ps aux | grep python | grep quantify"` sleep 1s echo 服务器IP echo `ssh root@服务器IP "ps aux | grep python | grep quantify"`
|
服务器
文件 stop.sh
1
| ps -ef | grep quantify | grep -v "color" | awk -F " " '{print $2}' | xargs kill -9
|
上面主要说一下跳板机的内容。
首先运行服务器上的 stop.sh
然后,输出服务器上的相关程序的状态。如果没有停止,则会输出相关的程序。