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


    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] 是这个命令的工作号,"+"代表这个命令是最近一个被放入后台的。
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 命令执行过裎中按 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命令没有结束,但也能取得控制台权限
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    #压缩一下/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
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 每个被放入后台的命令都会被分配一个工作号。第一个被放入后台的命令,工作号是 1;第二个被放入后台的命令,工作号是 2,以此类推。
    12.15 jobs命令:查看当前终端放入后台的工作
    • jobs 命令可以用来查看当前终端放入后台的工作,工作管理的名字也来源于 jobs 命令。jobs 命令的基本格式如下:
    [root@localhost ~]#jobs [选项]
    
    • 1
    • 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
    
    
    • 1
    • 2
    • 3
    • 4
    • 可以看到,当前终端有两个后台工作:一个是 top 命令,工作号为 1,状态是暂停,标志是"-“;另一个是 tar 命令,工作号为 2,状态是暂停,标志是”+“。”+“号代表最近一个放入后台的工作,也是工作恢复时默认恢复的工作。”-"号代表倒数第二个放入后台的工作,而第三个以后的工作就没有"±"标志了。

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

    12.16 fg命令:把后台命令恢复在前台执行
    • 使用 fg 命令将后台工作拿到前台来执行,fg 命令用于把后台工作恢复到前台执行,该命令的基本格式如下:
    [root@localhost ~]#fg %工作号
    
    • 1

    注意,在使用此命令时,% 可以省略,但若将% 工作号全部省略,则此命令会将带有 + 号的工作恢复到前台。另外,使用此命令的过程中, % 可有可无。

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

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

    [root@CncLucZK ~]# nohup find / -print > /root/nohup.log &
    [3] 2349
    #使用find命令,打印/下的所有文件。放入后台执行
    [root@CncLucZK ~]# nohup:忽略输入并把输出追加到"nohup.out"
    [root@CncLucZK ~]# nohup:忽略输入并把输出追加到"nohup.out"
    #有提示信息
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 接下来的操作要迅速,否则 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'
    #执行脚本
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15

    接下来退出登录,重新登录之后,这个脚本仍然可以通过“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 &
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8

    参考文献:
    Linux命令放入后台运行方法(&和Ctrl+Z)详解版

    下一篇:Linux学习-53-定时任务管理(at、anacron命令)
  • 相关阅读:
    CentOS7设置虚拟内存
    【量化交易笔记】11.移动平均交易策略
    得物App弱网诊断探索之路
    $set小概率的赋值失败问题都被我碰上了
    基于Micropython的桌面信息小摆件
    winpcap实现ARP欺骗攻击实验过程
    唯一索引和普通索引应该如何选择?
    ChatGLM2_6b安装
    乘法逆元学习记录
    Spring @Profile注解使用和源码解析
  • 原文地址:https://blog.csdn.net/weixin_42045639/article/details/128000046