使用shell调用screen实现多个任务后台执行

在开发的过程中或者使用软件的过程中,经常会有需要多个程序同时在后台执行的情况,需要在开始工作前把程序一个一个的启动起来,然后才能进行后续的工作。之前通过使用screen可以实现多个任务同时运行,并且不依赖ssh远程连接,即时断线也不会影响正在运行的程序。唯一的缺点是初始化的时候仍需要一个一个的加入进去,十分麻烦,现在考虑使用shell脚本调用screen实现多个任务后台执行。

什么是Screen

GNU Screen是一款由GNU计划开发的用于命令行终端切换的自由软件。用户可以通过该软件同时连接多个本地或远程的命令行会话,并在其间自由切换。

GNU Screen可以看作是窗口管理器的命令行界面版本。它提供了统一的管理多个会话的界面和相应的功能。

这里我不再详述,网络上有比较多的介绍,包括使用方法,这里推荐几个介绍的相对简单明了的blog:

linux screen 命令详解

linux 技巧:使用 screen 管理你的远程会话

screen(1) – Linux man page

需求说明

很多程序开发人员在开始工作前需要在服务器上启动诸多依赖程序,之后才能开始正常的工作,以我的开发工作为例,我们使用的是微服务的架构,在我开始写代码、调试之前,要开启大概6-10个微服务,才能开始写代码协同工作。

之前我尝试使用screen使服务器上的程序一直运行,并且不会因为我带着电脑回家而出现中断,但是近期由于测试要求,服务器经常需要重启,原来的screen在每次重启之后都要重新去设置,十分繁琐,开始考虑使用shell的方式自动化初始化screen,实现执行个脚本,开发环境就准备好的功能。

实现概述

  1. 声明一个screen名称
  2. 创建一个后台screen
  3. 将启动的shell命令一个一个以新窗口的方式的加入到screen中
  4. 验证

实现过程

我们先一步一步的写出步骤,最后再整合成shell脚本

声明screen名
# screen_name="cloud_init"
创建后台screen
# screen -dmS $screen_name

这里的参数意思是:

  • -d :detach 不进入screen内部
  • -m:不进入screen内部,和上面的d是配合的
  • -S:session name,创建的screen名称

创建完成后使用screen -ls 查看已经创建好的screen:

[root@localhost ~]# screen_name="cloud_init"
[root@localhost ~]# screen -dmS $screen_name 
[root@localhost ~]# screen -ls
There is a screen on:
	1594.cloud_init	(Detached)
1 Socket in /run/screen/S-root.
[root@localhost ~]# 
增加命令

示例:

# screen  -S cloud_init  -X screen ping www.baidu.com

这里参数的意思是:

  • -S:session name,指定的screen
  • -X: 执行一个screen特殊命令,这里后面跟着的screen意思是创建一个新的窗口
  • 后边直接接着要执行的命令就可以了

进入到screen中就可以看到创建了一个新的窗口,并且已经在执行ping的操作了

# screen -r cloud_init

最终脚本

我们使用shell的数组和循环实现多个命令同时调用的过程,脚本cloud_init.sh如下所示,这里我用了三个ping命令作为示例:

#!/bin/bash

# 命令集合
cmds=(
        "ping baidu.com"
        "ping 163.com"
        "ping 8.8.8.8"
)

# 创建一个screen
SCREEN_NAME=cloud_init
screen -dmS $SCREEN_NAME

# 循环执行命令,为每个命令新建一个窗口
for ((i=0;i<${#cmds[*]};i++))
do
        screen -x -S $SCREEN_NAME -X screen ${cmds[$i]}
done

PS

分享一个比较好用的screenrc文件,可以实现底边栏tab页显示和颜色区分

将其存储到~/.screenrc即可

startup_message off
defscrollback 4096
hardstatus alwayslastline
hardstatus string '%{= kG}[%= %{= kw}%?%-Lw%?%{r}(%{W}%n*%f%t%?(%u)%?%{r})%{w}%?%+Lw%?%?%= %{g}][%{kB} %d/%m/%y %D %{w}%c %{g}]'
vbell off

About the author

liuyuhang

View all posts

69 Comments

发表评论