screen混搭shell实现自动化工具

最近在自动化运维脚本的时候会经常用到screen,故在这里做一下记录

screen的终端参数命令

detach模式启动并执行新命令

启动新的session并为其命名, 同时在这个session里执行命令并detach:

screen -S <session-name> -d -m <command>

session-name是给定的名字, command是实际执行的命令, 可以带参数。

另外默认情况下执行命令会进入到screen的session里, 使用-d -m指定detach模式, 这样相当于后台执行, 不进入该命令的window。

在现有的session中新建window跑命令

screen用session-name识别不同的session。 开新的window跑新命令用这个:

screen -S <session-name> -X screen <command>

前提条件是这个session存在, 否则会提示“No screen session found.”

终端命令使用screen的注意事项

由于执行的命令是直接通过命令参数给到screen的session中的, 因此命令执行完成后session会被自动终止。

例如下面的随意一个命令:

screen -S test_screen ls
screen -S test_screen -d -m ls

都会直接返回, 因为命令执行完成后screen自动退出了。

但是下面几个就不会:

screen -S test_screen_top top
screen -S test_screen_top -d -m top

因为top一直在执行, 第一行命令会自动进入screen的session并且显示top的输出, 第二行命令需要自己调用screen重新attach到对应的session并获得top的输出, 否则一直在后台运行。

此外需要注意的是命令执行的成功与否一般看不出来, 因此博主的办法是检查当前的session是否存在, 并且进去看看是不是在执行目标命令。

重新attach现有的session

session -r <session-name>

screen的控制命令

突然发现居然没写过这货的介绍, 这里顺路补充一下。
开启screen新session的最直接命令就是在终端里

screen

这样便在新的session中创建了一个window并等待输入命令。

查看当前的所有session可以敲:

screen -ls

在screen中, 默认的控制指令是, 常见的命令有如下:

新的window:<Ctrl-a>, c
切换到下一个window:<Ctrl-a>, n
切换到上一个window:<Ctrl-a>, p
detach当前session:<Ctrl-a>, d

screen的退出与终端的退出相同, 当所有的windows都被<Ctrl-d>或者exit后整个screen的session就自动终止。

screen自动化脚本的完整实现

关于工作路径问题

博主的shell脚本都放在相同的目录里, 因此在一个脚本中调用其他脚本可直接使用./some_sh.sh。 然而问题在于工作路径是根据脚本被调用时终端所在的工作路径来的, 因此在home目录下调用则工作路径就变成/home, 自然就没办法执行不在目录下的其他脚本了。

博主原来的解决办法是在脚本的第一行给个cd, 并且用绝对路径写死, 确保切换到正确的工作路径, 问题在于写死的东西总是不够灵活。

后来发现可以通过dirname解决问题。 dirname可以从带路径的文件名称中截取出路径来, 例如/home/laoyi/abc/test.sh可以截取到/home/laoyi/abc, 因此在脚本中这么来一下就可以获得相对当前的目标路径, 再执行一次cd就可以确保在任何路径下调用脚本都能够正常运行。

完整实现

#!/bin/bash
DIR=`dirname $0`
cd $DIR
session_name=network_tool
screen -S $session_name -d -m bash ./goagent
screen -S $session_name -X screen bash ./dnsproxy
screen -S $session_name -X screen bash ./startproxy

设置session的名称为network_tool方便随时reattach查看状态。

至此, 启动所有工具只需要一个命令:

bash some_path/start_network_tools.sh

LXDE中开机启动项的添加
既然从七八个命令降到一个命令, 何不再进一步直接让脚本开启运行呢, 更加省事。

于是博主查了一下Arch Linux的文档, 发现可以通过添加命令到下面这个文件中直接添加启动项:

~/.config/lxsession/LXDE/autostart

如果文件不存在直接新建即可。

于是将上面的命令扔到autostart文件中, 从此开机自动运行所有工具, 上网只需直接开启firefox。

本文摘录于 老逸的个人站