在平常的工作中,我们经常遇见的一个情景是,我们必须等待某一个 linux 命令运行结束才能够继续工作,然而并不是所有的等待都是值得的。如果我们可以合理的使用子shell 来提高我们的工作效率。linux 为我们提供了完整的任务管理机制,使得我们能够对任务进行有效的管理。在交互式 shell 中,一个高效的子shell用法就是使用后台模式,在后台模式中运行命令可以在处理命令同时让出 CLI(命令行接口),让我们能够运行其他的命令。
要想把命令以后台模式的形式运行,我们只需要在命令的最后加入 & 符号。下面是一个例子:
1 | $ sleep 200 & |
在我们在 sleep 2000 (让会话暂停 2000 秒之后) 命令后面加上了 & 符号, 我们立刻得到了终端的控制权。shell 显示出两条信息,显示在方括号中的是后台任务号(1), 另一个是后台任务的进程 ID (23276)。在 Linux 中运行的每个程序都是一个进程,并且有一个进程 ID。通过 ps 命令,以及通道 对结果进行过滤,我们可以看见当前的命令依旧是处于运行的状态下。
在实际的工作中我们可以利用后台模式跳过等待 tar 等命令 无聊的处理环节
linux 也为我们提供了查看当前所有后台任务的命令 —— jobs,并为我们提供以下的参数
- -l:显示进程号;
- -p:仅任务对应的显示进程号;
- -n:显示任务状态的变化;
- -r:仅输出运行状态(running)的任务;
- -s:仅输出停止状态(stoped)的任务。
不带任何参数的 jobs 命令依旧能够为我们提供足够的信息。
1 | $ jobs |
与使用 & 让命令以后台模式运行相类似的任务管理方法是使用快捷键 Ctrl + Z, 在大多数的软件中,Ctrl + Z 通常作为撤销键的快捷,然而在 linx 中这个快捷键通常意味着: 将SIGTSTP(Signal Tty SToP) 信号发送到前台作业。当您按下此组合键时,正在运行的程序将停止,您将返回到命令提示符。此时使用 jobs 我们可以看见当前的任务以 Stopped 的状态放在了后台。
1 | jobs |
当你使用 vim 命令编辑文件时,你可以忘记了什么信息,需要查阅一下其他的文件,这种方式极其有用,你可以使用快捷键 Ctrl + Z,暂时停止当前的任务,等你查阅完需要的信息后,再通过 fg 命令恢复之前的任务。
1 | // fg %[后台任务号] |
你也可以通过 bg 命令 恢复后台暂时停止的任务,这与在命令后面使用 & 符号是一样的效果。
1 | sleep 2000 |
最后值得一提的 nohup 命令,nohup 是一个 POSIX 命令,用于忽略 SIGHUP (“signal hang up” 译:挂断信号) 。 SIGHUP信号是终端注销时所发送至程序的一个信号。
当我们注销掉 当前终端时,我们前面介绍的任务管理方式无论后台任务的状态都会被终端,我们只有使用 nohup 命令才能确保我们注销掉当前 session之后,任务依旧在后台运行。
1 | //使用方法如下 |
我们也可以重定向命令的输出到指定文件
1 | nohup 命令名 > 文件名 2>&1 & |
2>&1 解释:将标准错误 2 重定向到标准输出 &1 ,标准输出 &1 再被重定向输入到指定的文件中
如果你不想要保存命令的输出,你也可以直接将输出重定向到 /dev/null
1 | nohup 命令名 & > /dev/null |
在类Unix系统中,/dev/null,或称空设备,是一个特殊的设备文件,它丢弃一切写入其中的数据(但报告写入操作成功),读取它则会立即得到一个EOF。