Linux 后台运行--screen命令

本篇介绍了Linux 中常见的后台运行软件 --- Screen 的使用。

Linux 后台运行--screen命令

介绍:

官方文档: Gun.orgPDF
参考en.wikipedia

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

(从自己的角度来说)实际用途主要是在非图像化界面的Linux服务器上,后台运行程序,挂东西之类的。

注:以下命令均以ubuntu为基础,red hat与centos可能略有不同。

安装

sudo apt-get update
sudo apt-get install screen

新建窗口

新建一个窗口有3种方法:

是否给会话取名并不影响会话恢复,因为每个运行的会话都有一个PID,使用PID可以恢复。但取名更便于记忆。

  • screen
    最简单的新建窗口方式,执行后进入到一个窗口中;

  • screen -S name
    新建一个名字为name的窗口,并入到该窗口中
    例如:screen -S count 新建了一个叫count的窗口并进入,此命令格式会给会话取名;

  • screen command
    新建一个窗口并在窗口中执行command
    e.g.:screen python ./a.py 新建并执行a.py程序。

常用参数:

文档地址:https://www.gnu.org/software/screen/manual/screen.html#Invoking-Screen

screen -S yourname/pid -> 新建一个叫yourname的session
screen -ls -> 列出当前所有的session
screen -r yourname/pid -> 回到yourname这个session
screen -d yourname/pid -> 远程detach某个session
screen -d -r yourname/pid -> 结束当前session并回到yourname这个session

在每个screen session 下,所有命令都以 ctrl+a(C-a) 开始。
C-a ? -> 显示所有键绑定信息
C-a c -> 创建一个新的运行shell的窗口并切换到该窗口
C-a n -> Next,切换到下一个 window
C-a p -> Previous,切换到前一个 window
C-a 0..9 -> 切换到第 0..9 个 window
Ctrl+a [Space] -> 由视窗0循序切换到视窗9
C-a C-a -> 在两个最近使用的 window 间切换
C-a x -> 锁住当前的 window,需用用户密码解锁
C-a d -> detach,暂时离开当前session,将目前的 screen session (可能含有多个 windows) 丢到后台执行,并会回到还没进 screen 时的状态,此时在 screen session 里,每个 window 内运行的 process (无论是前台/后台)都在继续执行,即使 logout 也不影响。
C-a z -> 把当前session放到后台执行,用 shell 的 fg 命令则可回去。
C-a w -> 显示所有窗口列表
C-a t -> Time,显示当前时间,和系统的 load
C-a k -> kill window,强行关闭当前的 window
C-a [ -> 进入 copy mode,在 copy mode 下可以回滚、搜索、复制就像用使用 vi 一样
C-b Backward,PageUp
C-f Forward,PageDown
H(大写) High,将光标移至左上角
L Low,将光标移至左下角
0 移到行首
$ 行末
w forward one word,以字为单位往前移
b backward one word,以字为单位往后移
Space 第一次按为标记区起点,第二次按为终点
Esc 结束 copy mode
C-a ] -> Paste,把刚刚在 copy mode 选定的内容贴上

会话分离&恢复

你可以不中断screen窗口中程序的运行而暂时断开(detach)screen会话,并在随后时间重新连接(attach)该会话,重新控制各窗口中运行的程序。

分离
我们在一个窗口运行某个程序之后,想退出登录关闭terminal干点别的事,让程序在后台运行。这时就需要和窗口会话分离,有2种方式:

  • 快捷键Ctrl a + d表示进入命令模式
    在当前会话窗口中按Ctrl a +d快捷键可以实现分离,这时窗口会弹出[detached]的提示,并回到主窗口。

e.g.:
20180624213406

  • screen -d name
    远程分离,detach某个session,一般适用于某个会话未断开,但界面由于超时已失效的情况。需要分离会话重新连接的情况。

e.g.:
20180624213529

=恢复==
screen -r pid/name
回到分离(detach)在后台运行的会话。

杀死并清除会话

杀死会话

  1. kill -9 -pid
  • kill命令的语法为:kill [signal/option] PID(s)
    使用 -9 选项是因为其作用域很广,除非进程/线程使用系统调用,否则均会杀死进程。不含参数时默认发送15 标志数。
  1. ctrl + a 控制台
  • 使用Ctrl a + K 杀死当前窗口和窗口中运行的程序;
  • 使用Ctrl a 然后输入quit命令,退出Screen会话,这样退出会杀死所有窗口并退出其中运行的所有程序。

清除死去的会话:

screen -wipe

  • 当窗口被杀死后,再用screen -ls 可以看到该窗口后面的(???dead)字样,说明窗口死了,但是仍在占用空间。这时需要清除窗口。

e.g.:
QQ--20180624213715


结语:知道这些基础的screen命令,可以完成大致的使用。其他代替方案有:Tmux、nohup,有空可能会去了解下吧,这次就这样了。