screen介绍
我们经常需要SSH或者telent远程登录到Linux服务器,有时候运行的程序所需时间很长,由于远程连接服务器不稳定,经常程序还没有执行完就因为各种原因断开了与服务器的连接,导致功亏一篑。为什么断开服务器连接进程就会被杀死呢,这里需要引入一个Sighup信号的概念
引入之前,要了解一些基本的定义:
- 进程组
在Linux/ Unix中,进程组是指一个或者多个进程的集合,每个进程组有一个唯一的ID - 会话(session)
我们常见的Linux session一般指的是shell session,代表终端中当前的状态,在终端中只有一个session,当我们打开一个新的终端,总会创建一个新的session;就进程间的关系来说,会话由一个或者多个进程组组成,每个进程组称为一个job,来自单个登录的所有进程都属于同一个会话。会话是由会话中的第一个进程创建的,一般情况下是打开终端时创建的 shell 进程,该进程也叫 session 的领头进程。 - 控制终端
控制终端是进程的一个属性,子进程会从父进程那里继承控制终端,会话中的所有进程都从会话的领头进程那里继承控制终端。一般将会话的领头进程称为终端的控制进程。简而言之:一个会话只能与一个终端关联,这个终端被称为会话的控制终端。
shell 一次只允许一个进程组访问控制终端。来自控制终端的某些输入会导致信号被发送到与控制终端关联的进程组中的所有进程。该 进程组被称为控制终端上的前台 job。由 shell 管理的其他 job 在不访问终端的情况下,被称为后台 job。
SIGHUP信号
SIGHUP信号又称为挂断信号,它默认的动作是终止程序;当终端接口检测到挂断条件(比如网络断开或者正常的进程消亡)时,内核中的驱动会将SIGHUP信号发送到整个会话,这将会杀死会话中的所有进程。如果我们在session中执行了nohup等类似的命令,这些进程就不会再受SIGHUP信号的影响了,当session消亡时,相关的进程也不会随之结束。虽然nohup很容易使用,但还是比较“简陋”的,对于简单的命令能够应付过来,对于复杂的需要人机交互的任务就麻烦了。所以我们采用更为强大的实用程序screen。
Screen软件
Screen是一款由GNU计划开发的用于命令行终端切换的自由软件。用户可以通过该软件同时连接多个本地或远程的命令行会话,并在其间自由切换。简单来说,Screen是一个可以在多个进程之间多路复用一个物理终端的窗口管理器。
Screen中有会话的概念,用户可以在一个Screen会话中创建多个Screen窗口,在每一个Screen窗口中就像操作一个真实的telnet/SSH连接窗口那样。Screen还有更高级的功能,我们可以不中断Screen窗口中程序的运行而暂时断开(detach)Screen会话,并在随后时间重新连接(attach)该会话,重新控制各窗口中运行的程序。有了Screen,我们就可以保存工作内容,即便中途我们断开服务器连接,下次登录的时候会话也可以直接恢复,而且只要我们将Screen挂起,就能够保证里面的程序正常运行,我们只要时而查看程序的运行进度就可以了。
Screen常用命令
screen -S yourname # 新建一个名称为“yourname”的会话
screen -ls # 列出当前所有的会话
screen -r yourname # 回到yourname这个会话中
screen -d yourname # 远程断开某个会话
screen -d -r yourname # 结束当前session并回到yourname这个session
screen -X -S [session # you want to kill] quit # 杀死一个已经detached的Screen会话
在每个Screen会话下,所有命令都以 Ctrl + a 开始:
Ctrl+a+? # 显示所有键绑定信息
Ctrl+a+c # 创建一个新的运行shell的窗口并切换到该窗口
Ctrl+a+n # 切换到下一个 window
Ctrl+a+p # 切换到前一个 window
Ctrl+a+0…9 # 切换到第 0…9 个 window
Ctrl+a [Space] # 由视窗0循序切换到视窗9
Ctrl+a+Ctrl+a # 在两个最近使用的 window 间切换
Ctrl+a+x # 锁住当前的 window,需用用户密码解锁
Ctrl+a+d # detach,暂时离开当前session,将目前的 Screen session (可能含有多个 windows) 丢到后台执行,并会回到还没进 screen 时的状态,此时在 Screen session 里,每个 window 内运行的 process (无论是前台/后台)都在继续执行,即使 logout 也不影响
Ctrl+a+z # 把当前session放到后台执行,用 shell 的 fg 命令则可回去。
Ctrl+a+w # 显示所有窗口列表
Ctrl+a+t # 显示当前时间,和系统的 load
Ctrl+a+k # kill window,强行关闭当前的 window
Ctrl+a+] # paste,把刚刚在 copy mode 选定的内容贴上
Screen常用的方法
- 创建一个命名为“abc”的会话:screen -S abc
- 在abc里面运行我们需要的程序
- 暂时离开当前的会话:Ctrl+a+d
- 重新进入abc会话,查看程序运行情况:screen -r abc
- 程序运行结束,退出当前会话:Ctrl+a+d
- 查看目前的screen会话:screen -ls
- 杀死一个detached的会话:screen -X -S 4588 quit