本网站相关文章:

1. 远程执行

自动化库

远程自动化工具章节中我们介绍过自动化交互工具:

  • Expect
  • Python 封装的 pexpect
  • Python 封装的 SSH2 远程安全连接库 Paramiko
  • 对 Paramiko 封装的 fabric

这些工具能够让我们非常高效的进行运维自动化工作, 比如 fabric, 本人曾经参加过爬虫开发工作并单人水平较次的负责人, 我的爬虫经验是真的菜, 哈哈. 那时候的爬虫服务器架构简单说明是这样的:

spider-frame

因为历史原因, 公司基础服务部对 python 相关运行生态没有非常好的支持, 比如自动化部署, 自动化发布, 日志收集等等, 所以很多东西都只能爬虫部门自己来完成, 而且爬虫这边的项目还需要考虑到香港服务器和国内服务器两个地方部署的问题, 最棘手的一个问题是 GFW 的存在, 导致香港和伤害无法进行直连从而进行数据的良好交互(实际上可以基于 docker, jenkins 等工具实现 CI, 然后通过脚本来进行半自动化 CD).

因为缺少运维部门的支持, 故而只能自己动手实现简单的半自动化部署, 半自动化发布, 半自动环境搭建自动化的工作, 此时 fabric 就非常好的实现了上述的功能, 例如:

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
31
def restart_spider(conn, server_config, spidername, action, copy='Y'):
""" 重启某一个机器上的某一个爬虫服务
:param conn:连接句柄
:param server_config:连接主机配置
:param spidername: 重启的爬虫服务
:param action: 动作-重启, 关闭, 停止
"""
if conn.run('ls -ld {} > /dev/null'.format(app_config.get('SPIDER_DIR'))).failed:
print('进入目录:{}失败, 请检查'.format(app_config.get('SPIDER_DIR')))
return False

succ = False
# 这里通过fabric3内置conn命令连接远程服务器
with conn.cd('{}'.format(app_config.get('SPIDER_DIR'))):
# 1 拉取代码
conn.run('echo "+++进入Crawler目录, 准备拉取代码"')
if action in ('restart', 'start') and copy == 'Y':
cmd = 'cd {} && pwd && unzip -qo {} && rm -rf {} > /dev/null'.format(
app_config.get('SPIDER_DIR'), CRAWLER_ZIPFILE, CRAWLER_ZIPFILE)
if conn.run(cmd).failed:
print('---解压apiv1代码失败, 请检查')
return False

# 2 重启
spider_path = '{}/bin/{}'.format(
app_config.get('SPIDER_DIR'), app_config.get('SPDIER_CONFIGS')[spidername]['shell'])
result = conn.run('bash {} {}'.format(spider_path, action))
if result:
succ = True

return succ

但是, 有些时候我们往往只需要远程执行一些命令来进行测试或验证远端服务器的某些功能是否符合逻辑, 此时可以使用SSH 远程命令就能够简单快速的达到目的.

SSH 远程

  1. 查看主机的磁盘使用情况
1
2
3
4
# a. 通用方式
ssh bamboo@192.168.0.33 "df -h"
# b. 指定端口
ssh -p 18888 bamboo@192.168.0.33 "df -h"
  1. 执行多个命令
1
2
3
4
5
6
7
# a. 单行
ssh bamboo@192.168.0.33 "ls -l; df -h"
# b. 多行
ssh bamboo@192.168.0.33 "
> ls -l
> df -h
"
  1. 远程执行某个脚本
1
2
3
4
5
6
# a. 在远程服务器执行当前宿主机上的脚本, 其中local_test.sh并非在192.168.0.33上
ssh bamboo@192.168.0.33 < local_test.sh
ssh bamboo@192.168.0.33 < "local_test.sh arg1, arg2"
# b. 执行远程服务器上的脚本
ssh bamboo@192.168.0.33 "/home/who/test.sh"
ssh bamboo@192.168.0.33 "/home/who/test.sh args1 args2 "
  1. nohup 问题

在远程执行脚本的时候, 运维人员经常会在脚本内部编写nohup命令来调用其他脚本, 这样会导致和手动执行脚本不一样的效果, 远程 SSH 调用nohup不会立即退出, 而是等待脚本全部执行完毕才会退出, 此时应该采用重定向的方式来跳过这一步操作:

1
2
3
4
# a. 错误方式
ssh bamboo@192.168.0.33 "nohup /home/who/long.sh"
# b. 替代方式
ssh bamboo@192.168.0.33 "nohup /home/who/long.sh > /dev/null 2>&1 &"

至于为何不支持 nohup, 可能是 SSH 这边对 sighup 信号的处理有问题?

bash 模式

3. 参考