Linux会话与进程剖析

我们都用一个常识,那就是当关掉窗口或者会话的时候,进程会被杀死(通俗的说,就是断开了相关了任务连接),那么,这是为什么呢?其实这都是SIGHUP信号引起的。

SIGHUP信号

在Linux系统中,关于进程与会话有这样几个概念:

  • 进程组(process group)
    一个或多个进程的集合,每个进程都有一个进程组ID,这个ID也是进程组长进程的ID
  • 会话期(session)
    一个或多个进程组的集合,每个会话有唯一一个会话首进程(session leader),会话ID为会话首进程ID
  • 控制终端(controlling terminal)
    每一个会话可以有一个单独的控制终端,与控制终端连接的会话首进程就是控制进程(controlling process)。 这时候,与当前终端交互的就是前台进程组,其他的都是后台进程组。

终止过程

根据POSIX.1中的定义:

  • 控制信号(SIGHUP)默认动作是终止程序
  • 当终端接口检测到网络断开,会将挂断信号发送给控制进程(也就是会话首进程)
  • 如果会话首进程中止,则该信号发送给该会话的前台进程组
  • 一个进程退出导致了一个孤儿进程组产生时,如果任意一个孤儿进程组的进程处于STOP状态,则发送SIGHUP或者SIGCONT信号到该进程组中的所有进程,这时就相当于下达了判决书,所有此进程组中的进程被终止。

nohup后台程序

我们常常需要运行一个时限很长的进程(FTP文件传输,大作业Hadoop程序,Flume日志处理,etc),像是用 telnet/ssh 登录了远程的 Linux 服务器,运行了一些耗时较长的任务,结果却由于网络的不稳定导致任务中途失败。如何让命令提交后不受本地关闭终端窗口/网络断开连接的干扰呢?这就与SIGHUP信号有关。 事实上,我们要做的是不希望在关闭窗口的同时,接收到SIGHUP信号的响应,这时候,nohup命令就可以帮助我们:如果程序的标准输出(包括错误输出)是终端直接输出,那么nohup可以将这些输出重定向到nohup.txt文件中。 当然这样做后没有结束,nohup只是忽略了这些信号,我们还需要使用&将进程放在后台运行,具体为: [code]nohup [argument…] &[/code]

终端多路复用

nohup虽然简单好用,但往往只能解决简单的操作,如果是复杂的人机交互,nohup就无能为力了,这时候,我们就要请出众多的多终端复用的软件。

  • screen
    最古老也是最经典的多路复用窗口管理,可以轻松实现SSH断开任务和重新恢复,简单实用 用户可以在一个screen会话中创建多个screen窗口,在每一个screen窗口中就像操作一个真实的telnet/SSH连接窗口那样。(不过个人觉得热键稍微不好用,常常是Ctrl-a + XX,而且也缺少一些可见的提示,不过跟nohup比较还是升级了一大步)
  • tumx
    优秀的终端复用软件,类似GNU Screen,但来自于OpenBSD,采用BSD授权。使用它最直观的好处就是,通过一个终端登录远程主机并运行tmux后,在其中可以开启多个控制台而无需再“浪费”多余的终端来连接这台远程主机;当然其功能远不止于此。与screen相比的优点:可以横向和纵向分割窗口,且窗格可以自由移动和调整大小。可在多个缓冲区进行复制和粘贴,支持跨窗口搜索;非正常断线后不需重新detach;…… 有人说——与tmux相比,screen简直弱爆了。

  • byobu
    由Ubuntu开发,在Screen的基础上进行包装,使其更加易用的一个工具。最新的Byobu,已经是基于Tmux作为后端了。目前的Ubuntu11以上的版本都有预装,可通过“byobu-tmux”这个命令行前端来接受各种与tmux一模一样的参数来控制它。Byobu的细节做的非常好,以下是我在Elementary OS上安装的效果:ele-bo 以上的几款命令行软件都可以轻松的下载,RedHat/CentOS 使用yum(某些可能要更新yum源),Ubuntu系列使用apt-get即可。

  • 版权声明:自由转载-非商用-非衍生-保持署名 | Creative Commons BY-NC-ND 3.0

  • 转载请注明:Chentao’s Home