**工作管理指的是在单个登录终端(也就是登录的 Shell 界面)同时管理多个工作的行为。**也就是说,我们登陆了一个终端,已经在执行一个操作,我们可以再启动一个终端,然后执行其他的操作。我们还可以通过工作管理来实现在一个终端执行不同的操作。
例如,我在当前终端正在 vi 一个文件,在不停止 vi 的情况下,如果我想在同一个终端执行其他的命令,就应该把 vi 命令放入后台,然后再执行其他命令。把命令放入后台,然后把命令恢复到前台,或者让命令恢复到后台执行,这些管理操作就是工作管理。
后台管理有几个事项需要大家注意:
Linux 命令放入后台的方法有两种:
1.“命令 &”,把命令放入后台执行。
2.命令执行过裎中按 Ctrl+Z 快捷键,命令在后台处于暂停状态
第一种把命令放入后台的方法是在命令后面加入 空格 &。使用这种方法放入后台的命令,在后台处于执行状态。注意,放入后台执行的命令不能与前台有交互,否则这个命令是不能在后台执行的。例如:
[root@CncLucZK ~]# ps aux &
[1] 1317455
#[工作号] 进程号
#把ps命令放入后台执行,每个后台命令会被分配一个工作号。命令既然可以执行,就会有进程产生,所以也会有进程号
USER PID %CPU %MEM VSZ RSS TTY STAT START TIME COMMAND
root 1 0.0 0.5 242368 10852 ? Ss Oct19 0:36 /usr/lib/systemd/systemd
root 2 0.0 0.0 0 0 ? S Oct19 0:00 [kthreadd]
...
root 1317969 0.0 0.0 0 0 ? I 23:24 0:00 [kworker/1:0-ata_sff]
root 1317996 0.0 0.2 57832 3860 pts/0 R 23:24 0:00 ps aux
#上面是输出的结果,下方可以执行其他的命令操作
ll -d /test
drwxr-xr-x 6 root root 4096 Oct 25 13:43 /test
#这样,虽然 ps aux 命令在执行,但在当前终端仍然可以执行其他操作。如果在终端上出现如下信息:
[1]+ Done ps aux
#则证明后台的这个命令已经完成了。当然,命令如果有执行结果,则也会显示到操作终端上。其中,[1] 是这个命令的工作号,"+"代表这个命令是最近一个被放入后台的。
[root@localhost ~]#top #在top命令执行的过程中,按下Ctrl+Z快捷键
top - 23:30:06 up 6 days, 10:00, 1 user, load average: 0.07, 0.05, 0.07
Tasks: 101 total, 1 running, 100 sleeping, 0 stopped, 0 zombie
%Cpu(s): 3.0 us, 3.0 sy, 0.0 ni, 90.9 id, 3.0 wa, 0.0 hi, 0.0 si, 0.0 st
MiB Mem : 1829.1 total, 143.7 free, 662.1 used, 1023.3 buff/cache
MiB Swap: 1025.0 total, 1023.2 free, 1.8 used. 983.5 avail Mem
PID USER PR NI VIRT RES SHR S %CPU %MEM TIME+ COMMAND
1 root 20 0 242368 10852 8196 S 0.0 0.6 0:36.49 systemd
2 root 20 0 0 0 0 S 0.0 0.0 0:00.24 kthreadd
3 root 0 -20 0 0 0 I 0.0 0.0 0:00.00 rcu_gp
。。。
[1]+ Stopped top
[root@CncLucZK ~]#
#top命令被放入后台,工作号是1,状态是暂停。而且,虽然top命令没有结束,但也能取得控制台权限
#压缩一下/test/user/目录
#tar:从成员名中删除开头的"/"
#tar:从硬链接目标中删除开头的"/"
[root@CncLucZK test]# tar -zcf user.tar.gz user
^Z
#在执行过程中,按下Ctrl+Z快捷键
[2]+ Stopped tar -zcf user.tar.gz user
#tar命令被放入后台,工作号是2,状态是暂停
[root@localhost ~]#jobs [选项]
| 选项 | 含义 |
|---|---|
| -l(L 的小写) | 列出进程的 PID 号。 |
| -n | 只列出上次发出通知后改变了状态的进程。 |
| -p | 只列出进程的 PID 号。 |
| -r | 只列出运行中的进程。 |
| -s | 只列出已停止的进程。 |
[root@CncLucZK test]# jobs -l
[1]- 1318853 Stopped (signal) top (wd: ~)
[2]+ 1319494 Stopped tar -zcf user.tar.gz user
可以看到,当前终端有两个后台工作:一个是 top 命令,工作号为 1,状态是暂停,标志是"-“;另一个是 tar 命令,工作号为 2,状态是暂停,标志是”+“。”+“号代表最近一个放入后台的工作,也是工作恢复时默认恢复的工作。”-"号代表倒数第二个放入后台的工作,而第三个以后的工作就没有"±"标志了。
一旦当前的默认工作处理完成,则带减号的工作就会自动成为新的默认工作,换句话说,不管此时有多少正在运行的工作,任何时间都会有且仅有一个带加号的工作和一个带减号的工作。
[root@localhost ~]#fg %工作号
注意,在使用此命令时,% 可以省略,但若将
% 工作号全部省略,则此命令会将带有 + 号的工作恢复到前台。另外,使用此命令的过程中, % 可有可无。
[root@CncLucZK ~]#jobs
[1]- Stopped top
[2]+ Stopped tar-zcf etc.tar.gz/etc
[root@CncLucZK ~]# fg
#恢复“+”标志的工作,也就是tar命令
[root@CncLucZK ~]# fg %1
#恢复1号工作,也就是top命令
Ctrl+Z 快捷键的方式,将前台工作放入后台,但是会处于暂停状态。bg 命令的基本格式如下:[root@localhost ~]# bg %工作号
和 fg 命令类似,这里的 % 可以省略。
把前面章节中放入后台的两个工作恢复运行,命令如下:
[root@CncLucZK ~]# bg %1 <--- 等同于 bg 1
[root@CncLucZK ~]# bg %2 <--- 等同于 bg 2
#把两个命令恢复到后台执行
[root@CncLucZK @]# jobs
[1]+ Stopped top
[2]- Running tar -zcf etc.tar.gz /etc &
#tar命令的状态变为了Running,但是top命令的状态还是Stopped
[root@localhost ~]# nohup [命令] &
注意,这里的‘&’表示此命令会在终端后台工作;反之,如果没有‘&’,则表示此命令会在终端前台工作。
[root@CncLucZK ~]# nohup find / -print > /root/nohup.log &
[3] 2349
#使用find命令,打印/下的所有文件。放入后台执行
[root@CncLucZK ~]# nohup:忽略输入并把输出追加到"nohup.out"
[root@CncLucZK ~]# nohup:忽略输入并把输出追加到"nohup.out"
#有提示信息
[root@CncLucZK test]# vi test.sh
#!/bin/bash
for ((i=0;i<=10000;i=i+1))
#循环10000次
do
echo "hello linux!" >> /test/nohup.log
#nohup.log文件中写入hello linux!
sleep 5s
#每次循环睡眠10秒
done
[root@CncLucZK test]# chmod 755 test.sh
[root@CncLucZK test]# nohup /test/nohup.sh &
[2] 1326130
[root@CncLucZK test]# nohup: ignoring input and appending output to 'nohup.out'
#执行脚本
接下来退出登录,重新登录之后,这个脚本仍然可以通过“ps aux”命令看到。
[root@CncLucZK ~]# ps aux |grep sleep
root 2211 0.0 0.9 1319176 18076 ? Sl Oct19 1:15 /bin/sh -c sleep 100
root 1325785 0.0 0.0 7284 712 pts/0 T 00:19 0:00 sleep 5s
root 1326357 0.0 0.0 7284 812 pts/0 S 00:22 0:00 sleep 5s
root 1326359 0.0 0.0 12112 1068 pts/1 S+ 00:22 0:00 grep --color=auto sleep
[root@CncLucZK test]# jobs -l
[1]+ 1325785 Stopped sleep 5s
[2]- 1326130 Running nohup /test/nohup.sh &
参考文献:
Linux命令放入后台运行方法(&和Ctrl+Z)详解版