Linux学习-52-Linux工作管理-后台命令运行管理

114 篇文章 11 订阅
12.13 Linux工作管理简介
  • **工作管理指的是在单个登录终端(也就是登录的 Shell 界面)同时管理多个工作的行为。**也就是说,我们登陆了一个终端,已经在执行一个操作,我们可以再启动一个终端,然后执行其他的操作。我们还可以通过工作管理来实现在一个终端执行不同的操作。

  • 例如,我在当前终端正在 vi 一个文件,在不停止 vi 的情况下,如果我想在同一个终端执行其他的命令,就应该把 vi 命令放入后台,然后再执行其他命令。把命令放入后台,然后把命令恢复到前台,或者让命令恢复到后台执行,这些管理操作就是工作管理。

  • 后台管理有几个事项需要大家注意:

    1. 前台是指当前可以操控和执行命令的这个操作环境;后台是指工作可以自行运行,但是不能直接用 Ctrl+C 快捷键来中止它,只能使用 fg/bg 来调用工作。
    2. 当前的登录终端只能管理当前终端的工作,而不能管理其他登录终端的工作。比如 tty1 登录的终端是不能管理 tty2 终端中的工作的。
    3. 放入后台的命令必须可以持续运行一段时间,这样我们才能捕捉和操作它。
    4. 放入后台执行的命令不能和前台用户有交互或需要前台输入,否则只能放入后台暂停,而不能执行。比如 vi 命令只能放入后台暂停,而不能执行,因为 vi 命令需要前台输入信息;top 命令也不能放入后台执行,而只能放入后台暂停,因为 top 命令需要和前台交互。
12.14 Linux命令放入后台运行方法(&和Ctrl+Z)
  • 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] 是这个命令的工作号,"+"代表这个命令是最近一个被放入后台的。
  • 命令执行过裎中按 Ctrl+Z 快捷键,命令在后台处于暂停状态。使用这种方法放入后台的命令,就算不和前台有交互,能在后台执行,也处于暂停状态,因为 Ctrl+Z 快捷键就是暂停的快捷键。
[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,状态是暂停
  • 每个被放入后台的命令都会被分配一个工作号。第一个被放入后台的命令,工作号是 1;第二个被放入后台的命令,工作号是 2,以此类推。
12.15 jobs命令:查看当前终端放入后台的工作
  • jobs 命令可以用来查看当前终端放入后台的工作,工作管理的名字也来源于 jobs 命令。jobs 命令的基本格式如下:
[root@localhost ~]#jobs [选项]
  • 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,状态是暂停,标志是”+“。”+“号代表最近一个放入后台的工作,也是工作恢复时默认恢复的工作。”-"号代表倒数第二个放入后台的工作,而第三个以后的工作就没有"±"标志了。

  • 一旦当前的默认工作处理完成,则带减号的工作就会自动成为新的默认工作,换句话说,不管此时有多少正在运行的工作,任何时间都会有且仅有一个带加号的工作和一个带减号的工作。

12.16 fg命令:把后台命令恢复在前台执行
  • 使用 fg 命令将后台工作拿到前台来执行,fg 命令用于把后台工作恢复到前台执行,该命令的基本格式如下:
[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命令
  • top 命令是不能在后台执行的,所以,如果要想中止 top 命令,要么把 top 命令恢复到前台,然后正常退出;要么找到 top 命令的 PID,使用 kill 命令杀死这个进程。
12.17 bg命令:把后台暂停的工作恢复到后台执行
  • bg 命令:可以让后台工作继续在后台执行,而对于使用 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
  • 可以看到,tar 命令确实已经在后台执行了,但是 top 命令怎么还处于暂停状态呢?原因很简单,top 命令是需要和前台交互的,所以不能在后台执行。换句话说,top 命令就是给前台用户显示系统性能的命令,如果 top 命令在后台恢复运行了,那么给谁去看结果呢?
12.18 nohup命令:后台命令脱离终端运行
  • 进程可以放到后台运行,这里的后台,其实指的是当前登陆终端的后台。这种情况下,当我们以远程管理服务器的方式,在远程终端执行后台命令,如果在命令尚未执行完毕时就退出登陆,这个后台命令就不会继续执行,此命令的执行会被中断。这就引出一个问题,如果我们确实需要在远程终端执行某些后台命令,该如何执行呢?有以下 3 种方法:
  1. 把需要在后台执行的命令加入 /etc/rc.local 文件,让系统在启动时执行这个后台程序。这种方法的问题是,服务器是不能随便重启的,如果有临时后台任务,就不能执行了。
  2. 使用系统定时任务,让系统在指定的时间执行某个后台命令。这样放入后台的命令与终端无关,是不依赖登录终端的。
  3. 使用 nohup 命令。
  • nohup 命令:作用就是让后台工作在离开操作终端时,也能够正确地在后台执行。此命令的基本格式如下:
[root@localhost ~]# nohup [命令] &

注意,这里的‘&’表示此命令会在终端后台工作;反之,如果没有‘&’,则表示此命令会在终端前台工作。

[root@CncLucZK ~]# nohup find / -print > /root/nohup.log &
[3] 2349
#使用find命令,打印/下的所有文件。放入后台执行
[root@CncLucZK ~]# nohup:忽略输入并把输出追加到"nohup.out"
[root@CncLucZK ~]# nohup:忽略输入并把输出追加到"nohup.out"
#有提示信息
  • 接下来的操作要迅速,否则 find 命令就会执行结束。然后我们退出登录,重新登录之后或在另一个bash终端,执行“ps aux”命令,会发现 find 命令还在运行。如果 find 命令执行太快,我们就可以写一个循环脚本,然后使用 nohup 命令执行。例如:
[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)详解版

下一篇:Linux学习-53-定时任务管理(at、anacron命令)
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值