Chinaunix首页 | 论坛 | 博客
  • 博客访问: 431535
  • 博文数量: 101
  • 博客积分: 1547
  • 博客等级: 上尉
  • 技术积分: 1072
  • 用 户 组: 普通用户
  • 注册时间: 2006-01-12 23:46
个人简介

music,code,dialog,rest

文章分类

全部博文(101)

文章存档

2023年(8)

2022年(25)

2021年(6)

2020年(2)

2019年(6)

2018年(4)

2017年(5)

2016年(20)

2015年(4)

2014年(2)

2013年(1)

2012年(1)

2011年(1)

2010年(1)

2009年(2)

2007年(10)

2006年(3)

分类: LINUX

2021-12-11 06:35:33

screen是持久型虚拟终端的重要工具。对于长时间运行的重要运维指令,需要放在screen中去执行,以排除远程终端的各种连接因素对于执行指令期间的种种影响。
在自动化过程中,对于screen会话的远程控制管理又成为自动化编排重点。
这里记录一下对于screen 远程管理的特点和用法,重点是程管理screen会话。
screen 主要参与自动化,最重要的功能就是 -X 选项,但是不幸的是官方manual并没有详细介绍这种方法。

screen会话远程创建

点击(此处)折叠或打开

  1. createScreenWithName() {
  2.     screenname=$1
  3.     passwd=aaaa
  4.     someserver=1.1.1.1
  5.     sshpass -p $passwd ssh $someSSHOptions $someserver screen -dmS $screenname -L bash
  6. }

screen会话远程命令发送(效果类似异步命令)

点击(此处)折叠或打开

  1. SendCommandWithScreenName() {
  2.     screenname=$1
  3.     shift
  4.     cmdstr="$*"
  5.     sshpass -p $passwd ssh $someSSHOptions -t $ctrlserver "screen -DRS $screenname -X stuff \"$cmdstr\"$(echo -ne '\015')"
  6. }

需要注意的是 -X stuff,  这个应该是screen的固定用法。man中只提到stuff是命令。但没有完整解释。从其部分解释的理解来看,应该就是current input buffer, 所以真正的command string\r需要作为sub-command 跟在input buffer的后面。

screen 会话远程终结

点击(此处)折叠或打开

  1. sendCommandWithScreenName ansible exit

这样实现后,screen突然变成了一个带状态的异步执行器。需要执行的指令的时候,向screen的命名会话发送一条/多条指令即可,通过其执行日志,可以获得执行的stdout/stderr信息。为后续自动化编排带来了更多的自由想象空间。


带状态的含义是: 比如我需要先进入某个目录,或设置某个环境变量, 然后再执行重要的指令。
这种场景可以远程发送多条指令,给一个同名的screen 会话,这样前后执行环境都会受到影响。以确保执行指令的环境一致性。

2019/10/15
阅读(556) | 评论(0) | 转发(0) |
给主人留下些什么吧!~~