50 Linux系统管理-工作管理
1、Linux工作管理简介(通俗易懂)
工作管理指的是在单个登录终端(也就是登录的 Shell 界面)同时管理多个工作的行为。也就是说,我们登陆了一个终端,已经在执行一个操作,那么是否可以在不关闭当前操作的情况下执行其他操作呢?
当然可以,我们可以再启动一个终端,然后执行其他的操作。不过,是否可以在一个终端执行不同的操作呢?这就需要通过工作管理来实现了。
例如,我在当前终端正在 vi 一个文件,在不停止 vi 的情况下,如果我想在同一个终端执行其他的命令,就应该把 vi 命令放入后台,然后再执行其他命令。把命令放入后台,然后把命令恢复到前台,或者让命令恢复到后台执行,这些管理操作就是工作管理。
后台管理有几个事项需要大家注意:
- 前台是指当前可以操控和执行命令的这个操作环境;后台是指工作可以自行运行,但是不能直接用 Ctrl+C 快捷键来中止它,只能使用 fg/bg 来调用工作。
- 当前的登录终端只能管理当前终端的工作,而不能管理其他登录终端的工作。比如 tty1 登录的终端是不能管理 tty2 终端中的工作的。
- 放入后台的命令必须可以持续运行一段时间,这样我们才能捕捉和操作它。
- 放入后台执行的命令不能和前台用户有交互或需要前台输入,否则只能放入后台暂停,而不能执行。比如 vi 命令只能放入后台暂停,而不能执行,因为 vi 命令需要前台输入信息;top 命令也不能放入后台执行,而只能放入后台暂停,因为 top 命令需要和前台交互。
2、命令放入后台运行方法(&和Ctrl+Z)详解版
Linux 命令放入后台的方法有两种,分别介绍如下。
"命令 &",把命令放入后台执行
第一种把命令放入后台的方法是在命令后面加入 空格 &。使用这种方法放入后台的命令,在后台处于执行状态。
注意,放入后台执行的命令不能与前台有交互,否则这个命令是不能在后台执行的。例如:
[root@localhost ~]#find / -name install.log & [1] 1920 #[工作号] 进程号 #把find命令放入后台执行,每个后台命令会被分配一个工作号。命令既然可以执行,就会有进程产生,所以也会有进程号
这样,虽然 find 命令在执行,但在当前终端仍然可以执行其他操作。如果在终端上出现如下信息:
[1]+ Done find / -name install.log
则证明后台的这个命令已经完成了。当然,命令如果有执行结果,则也会显示到操作终端上。其中,[1] 是这个命令的工作号,"+"代表这个命令是最近一个被放入后台的。
命令执行过裎中按 Ctrl+Z 快捷键,命令在后台处于暂停状态
使用这种方法放入后台的命令,就算不和前台有交互,能在后台执行,也处于暂停状态,因为 Ctrl+Z 快捷键就是暂停的快捷键。
【例 1】
[root@localhost ~]#top #在top命令执行的过程中,按下Ctrl+Z快捷键 [1]+ Stopped top #top命令被放入后台,工作号是1,状态是暂停。而且,虽然top命令没有结束,但也能取得控制台权限
【例 2】
[root@localhost ~]# tar -zcf etc.tar.gz /etc #压缩一下/etc/目录 tar:从成员名中删除开头的"/" tar:从硬链接目标中删除开头的"/" ^Z #在执行过程中,按下Ctrl+Z快捷键 [2]+ Stopped tar-zcf etc.tar.gz/etc #tar命令被放入后台,工作号是2,状态是暂停
每个被放入后台的命令都会被分配一个工作号。第一个被放入后台的命令,工作号是 1;第二个被放入后台的命令,工作号是 2,以此类推。
3、jobs命令:查看当前终端放入后台的工作
jobs 命令可以用来查看当前终端放入后台的工作,工作管理的名字也来源于 jobs 命令。
jobs 命令格式如下:
[root@localhost ~]#jobs [选项]
选项:
- -l:显示工作的 PID;
例如:
[root@localhost ~]#jobs -l [1]- 2023 Stopped top [2]+ 2034 Stopped tar -zcf etc.tar.gz /etc
可以看到,当前终端有两个后台工作:一个是 top 命令,工作号为 1,状态是暂停,标志是"-";另一个是 tar 命令,工作号为 2,状态是暂停,标志是"+"。
"+"号代表最近一个放入后台的工作,也是工作恢复时默认恢复的工作。"-"号代表倒数第二个放入后台的工作,而第三个以后的工作就没有"+-"标志了。
4、fg命令:把后台命令恢复在前台执行
如果想把后台工作恢复到前台执行,就需要执行 fg 命令。
fg 命令格式如下:
[root@localhost ~]#fg %工作号
参数:
- %工作号:"%"可以省略,但是注意工作号和PID的区别;
例如:
[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 命令杀死这个进程。
5、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 命令是需要和前台交互的,所以不能在后台执行。top 命令就是给前台用户显示系统性能的命令,所以是不能在后台恢复运行的。如果 top 命令在后台恢复运行了,那么给谁去看结果呢?
6、后台命令脱离终端运行方法(nohup命令)详解版
我们知道,把命令放入后台,只能在当前登录终端执行。如果是远程管理的服务器,在远程终端执行了后台命令,这时退出登录,那么这个后台命令还能继续执行吗?
当然是不行的,这个后台命令会被中止。但是我们确实需要在远程终端执行某些后台命令,该如何执行呢?有以下 3 种方法:
- 把需要在后台执行的命令加入 /etc/rc.local 文件,让系统在启动时执行这个后台程序。这种方法的问题是,服务器是不能随便重启的,如果有临时后台任务,就不能执行了。
- 使用系统定时任务,让系统在指定的时间执行某个后台命令。这样放入后台的命令与终端无关,是不依赖登录终端的。
- 使用 nohup 命令。
nohup 命令的作用就是让后台工作在离开操作终端时,也能够正确地在后台执行。
nohup 命令格式如下:
[root@localhost ~]# nohup [命令] &
例如:
[root@localhost ~]# nohup find / -print > /root/file.log & [3] 2349 #使用find命令,打印/下的所有文件。放入后台执行 [root@localhost ~]# nohup:忽略输入并把输出追加到"nohup.out" [root@localhost ~]# nohup:忽略输入并把输出追加到"nohup.out" #有提示信息
接下来的操作要迅速,否则 find 命令就会执行结束。然后我们可以退出登录,重新登录之后,执行“ps aux”命令,会发现 find 命令还在运行。
如果 find 命令执行太快,我们就可以写一个循环脚本,然后使用 nohup 命令执行。例如:
[root@localhost ~]# vi for.sh #!/bin/bash for ((i=0;i<=1000;i=i+1)) #循环1000次 do echo 11 >> /root/for.log #在for.log文件中写入11 sleep 10s #每次循环睡眠10秒 done [root@localhost ~]# chmod 755 for.sh [root@localhost ~]# nohup /root/for.sh & [1] 2478 [root@localhost ~]# nohup:忽略输入并把输出追加到"nohup.out" #执行脚本
接下来退出登录,重新登录之后,这个脚本仍然可以通过“ps aux”命令看到。
浙公网安备 33010602011771号