在前台运行某个命令,终端被该作业占据,而在后台运行作业时,不会占据终端。下面将介绍几种在前台与后台之间切换的方法。

前台转入后台

第一种,在要运行的命令后面加上&,命令自动转入后台运行,不占用前台终端。例如运行一个不断打印字符串到标准输出的可执行程序,输入如下:
$ vi test.c
#include <stdio.h>
main()
{
   while(1)
      print("ok \n");
}
$ gcc -o test test.c
$ ./test &
此时test程序将转入后台继续执行,并在标准输出即控制台上打印出字符。停止该程序的方法是利用ps命令找到该程序的对应进程号num,然后运行kill num。注意:在控制台中不断出现的打印字符会淹没输入的命令,但是没有任何影响,命令依然可以被正确解析。

第二种,运行./test后,使用ctrl+z使正在运行的命令./test暂停(ctrl+c是终止),用命令jobs查看想要转入后台的命令编号n,然后运行bg n即可。注意,该命令的最终作用等价于将./test命令后面加上&符号。

第三种,使用nohup+命令的运行方式,在缺省情况下该命令的所有输出都被重定向到一个名为nohup.out的文件中,除非有指定的重定向文件。例如:
nohup command &
nohup command >result 2>&1 &
而且使用nohup转入后台的命令,在关闭shell后重新登录,该命令依然处于运行状态,但通过ps命令不会显示,而是使用ps x或者ps –A命令方可显示。
注意:如果是执行脚本并重定向输出的话,不应该在脚本内部写,而是写成:
nohup ./***.sh >result 2>&1 &

以上三种方法的特点是:第一、二种方法在退出该shell进程后命令均不存在。第三种方法即使退出shell进程后,命令依然存在,而命令的控制权交给了init。

后台转入前台

使用jobs命令查看要转入前台的命令编号n,然后运行fg n即可。fg命令即"front ground"。