概述
在Linux 中我们登陆了一个终端,已经在执行一个操作,可以通过一定的操作或命令在不关闭当前操作的情况下执行其他操作。
例如,我在当前终端正在 vi 一个文件,在不停止 vi 的情况下,如果我想在同一个终端执行其他的命令,就应该把 vi 命令放入后台,然后再执行其他命令。把命令放入后台,然后把命令恢复到前台,或者让命令恢复到后台执行。
后台管理有几个事项需要大家注意:
- 前台是指当前可以操控和执行命令的这个操作环境;后台是指工作可以自行运行,但是不能直接用 Ctrl+C 快捷键来中止它,只能使用 fg/bg 来调用工作。
- 当前的登录终端只能管理当前终端的工作,而不能管理其他登录终端的工作。比如 tty1 登录的终端是不能管理 tty2 终端中的工作的。
- 放入后台的命令必须可以持续运行一段时间,这样我们才能捕捉和操作它。
- 放入后台执行的命令不能和前台用户有交互或需要前台输入,否则只能放入后台暂停,而不能执行。比如 vi 命令只能放入后台暂停,而不能执行,因为 vi 命令需要前台输入信息;top 命令也不能放入后台执行,而只能放入后台暂停,因为 top 命令需要和前台交互。
Linux命令放入后台运行的方法
把Linux 命令放入后台的方法有两种。
- 第一种是在命令后面加入" 空格 & "。使用这种方法放入后台的命令,在后台处于执行状态。
- 第二种是在命令执行过裎中按 Ctrl+Z 快捷键,命令在后台处于暂停状态。
每个被放入后台的命令都会被分配一个工作号。第一个被放入后台的命令,工作号是 1;第二个被放入后台的命令,工作号是 2,以此类推。
jobs命令:查看当前终端放入后台的工作
jobs 命令可以用来查看当前终端放入后台的工作,jobs 命令格式如下:
[root@localhost ~]#jobs [选项]
选项:
- -l:显示工作的 PID;
jobs命令:查看当前终端放入后台的工作
[root@localhost ~]#jobs -l [1]- 2023 Stopped top [2]+ 2034 Stopped tar -zcf etc.tar.gz /etc
可以看到,当前终端有两个后台工作:一个是 top 命令,工作号为 1,状态是暂停,标志是"-";另一个是 tar 命令,工作号为 2,状态是暂停,标志是"+"。
"+"号代表最近一个放入后台的工作,也是工作恢复时默认恢复的工作。"-"号代表倒数第二个放入后台的工作,而第三个以后的工作就没有"+-"标志了。
fg命令:把后台命令恢复在前台执行
如果想把后台工作恢复到前台执行,就需要执行 fg 命令。fg 命令格式如下:
[root@localhost ~]#fg %工作号
- %工作号:"%"可以省略,但是注意工作号和PID的区别;
fg命令把后台命令恢复在前台执行
默认是回复最近的一个放入后台的工作
[root@localhost ~]#jobs [1]- Stopped top [2]+ Stopped tar-zcf etc.tar.gz/etc [root@localhost ~]# fg #恢复“+”标志的工作,也就是tar命令 [root@localhost ~]# fg %1 #恢复1号工作,也就是top命令
top 命令是不能在后台执行的,所以,如果要想中止 top 命令,要么把 top 命令恢复到前台,然后正常退出;要么找到 top 命令的 PID,使用 kill 命令杀死这个进程。
bg命令:把后台暂停的工作恢复到后台执行
使用 Ctrl+Z
快捷键方式放入后台的命令,在后台都处于暂停状态,使用 bg 命令可以让这个后台工作继续在后台执行。bg 命令格式如下:
[root@localhost ~]# bg %工作号
把刚刚放入后台的两个工作恢复运行
[root@localhost ~]# bg %1 [root@localhost ~]# bg %2 #把两个命令恢复到后台执行 [root@localhost @]# jobs [1]+ Stopped top [2]- Running tar -zcf etc.tar.gz /etc & #tar命令的状态变为了Running,但是top命令的状态还是Stopped
可以看到,tar 命令确实已经在后台执行了, 因为 top 命令是需要和前台交互的,所以还处于暂停状态。top 命令就是给前台用户显示系统性能的命令,所以是不能在后台恢复运行的。
nohup命令
把命令放入后台,只能在当前登录终端执行。如果是远程管理的服务器,在远程终端执行了后台命令,这时退出登录,那么这个后台命令被中止。但是我们确实需要在远程终端执行某些后台命令,该如何执行呢?有以下 3 种方法:
- 把需要在后台执行的命令加入 /etc/rc.local 文件,让系统在启动时执行这个后台程序。这种方法的问题是,服务器是不能随便重启的,如果有临时后台任务,就不能执行了。
- 使用系统定时任务,让系统在指定的时间执行某个后台命令。这样放入后台的命令与终端无关,是不依赖登录终端的。
- 使用 nohup 命令。
nohup 命令的作用就是让后台工作在离开操作终端时,也能够正确地在后台执行。nohup 命令格式如下:
[root@localhost ~]# nohup [命令] &
使用find命令,打印/下的所有文件。放入后台执行
[root@localhost ~]# nohup find / -print > /root/file.log & [3] 2349
接下来退出登录,重新登录之后,这个脚本仍然可以通过“ps aux”命令看到。