Linux后台任务:Screen

0x81 Linux 中的后台任务

Linux作为互联网行业服务器上大量运行的软件,我们通常需要在其运行一些服务软件,也就是常说的daemon——守护进程,比如大部分服务伴随启动的sshd(ssh),httpd(apache)等,它们都是init或systemd的子进程,它们都是后台进程,一直监听着端口以向用户提供服务。

0x82 Linux 后台任务方式

Linux下将程序置于后台通常有三种方式:

  1. "&" 命令后置符
    这种方式将程序置于后台去运行,可以使用jobs命令查看当前login shell下有多少关联的后台任务,fgbg命令可以分别改变任务的运行方式。这种方式最简单,但是也有一个明显的坏处,那就是在你的shell退出后,这个后台任务也相应的退出了,因此只能用来做一些简单的短时的后台任务,比如编译一个小程序同时像监视CPU状况。

  2. "nohup" 配合"&"
    这种方式和命令后置符差不多,只是nohup这个命令可以让程序忽略掉用户退出登录时的SIG_HANG挂起信号,从而保证你退出登录程序也能运行。这种方式一定程度上让后台运行更可控,但是当我们通过ssh连接到远程服务器时,sshd其实给我们fork了一个子进程来运行bash shell,所以我们的后台任务是它的子程序,当我们断开连接这个后台任务还是会被杀死,这种状况我们就可以使用screen来开启一个“窗口”,在screen里执行后台任务,它是由screen管理器统一管理的。

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

0x83 如何通过screen管理后台任务

我们通过很简单的一句命令就可以达到我们的目的,它的初始用法类似nohup:

1
screen nohup mongodb-linux-x86_64-3.2.10/bin/mongod --dbpath nodejs/db &

之后我们就进入了一个新的命令行窗口,我们用jobs命令看一下后台的任务:

01

在screen中的所有可操作快捷键都以Ctrl+a开始,比如我们继续Ctrl+d就可以detach这个screen,回到之前的shell,我们可用screen -r重连刚刚detach的screen:

02

如果我们离开了ssh的shell,回来还想连接这个screen怎么办,screen提供了-ls参数用于查询当前运行的screen,之后根据id-r就可以了:

03

screen支持的功能非常多,会话共享、多会话切换等功能都是很有用的特性,需要的话查manual就可以了。