• Linux的作业管理


    一、作业管理的场景

    作业管理(job control)是在bash环境下使用的,主要使用在同一个bash中管理多个作业的场景,譬如登录bash之后想同时复制文件、数据搜索,编译。

    但是bash的作业管理,有以下限制

    • 程序必须是shell的子进程
    • 程序不能等待terminal/shell的输入


    二、涉及到的命令

    1. 将命令后台运行的&

    bash环境下,存在前台(foreground)和后台(background)两种作业:

    • 前台:你可以控制的作业
    • 后台:在内存可以自行运行的作业,无法直接控制,除非用命令调出来

    把前台作业放在后台,最简单的方式就是使用&:

    tar -zpcf /tmp/etc.tar.gz /etc &
    [1] 2080 # [job number] PID

    将命令放到后台之后,bash会给这个命令一个作业号,后面带这这个命令触发的进程的PID,然后我们就可以继续操作bash了。

    放在后台的任务完成之后,会在屏幕上显示以下信息:

    [1]+  Done                    tar -czvf /tmp/etc.tar.gz /etc

    表示作业号为[1]的作业已经完成。

    把作业放在后台运行,其数据流实际上还是会直接在屏幕上打印出来,如果我们改动一下刚才的命令:

    tar -zpcvf /tmp/etc.tar.gz /etc &

    就会发现,作业的stdout和stderr依然会输出到屏幕上,让我们无法控制下一个前台作业,这个时候最好是用数据流重定向:

    tar -zpcvf /tmp/etc.tar.gz /etc > /tmp.log 2>&1 &


    2. 把当前作业放在后台并暂停:ctrl+z

    譬如在编辑一个文件的时候想做别的东西:

    vi ~/.bashrc
    # 在vi的一般模式下,按下ctrl+z组合键
    [2]+  Stopped                 vi ~/.bashrc

    作业号后面的+号表示这是当前在后台默认的作业,Stopped表示这样作业的状态。


    3. 观察当前后台作业状态:jobs

    jobs [option]
    option:
    -l:除了列出作业号外,同时列出PID
    -r:仅列出正在后台运行的作业
    -s:仅列出正在后台暂停的作业

    观察当前bash中所有作业及其PID:

    jobs -l
    [2]-  2099 Stopped                 vi ~/.bashrc
    [3]+  2110 Stopped                 vi ~/.bash_history

    可以看到作业号后面的+-号,+表示默认作业,如果只输入fg的时候,那么默认作业[3]会被提到前台。


    4. 将后台作业提到前台处理:fg

    fg %jobnum
    option:
    %jobnum:作业的号码,%可有可无

    如把刚才的默认作业提到前台:

    fg

    把作业号为2的作业提到前台:

    fg %2


    5. 使后台作业从暂停到运行:bg

    譬如:

    find / -perm +7000
    # 立刻按下ctrl+z组合键
    [1]+  Stopped                 find / -perm +7000

    然后,让这个作业在后台从暂停转为运行,观察之:

    jobs;bg %1;jobs
    [1]+  Stopped                 find / -perm +7000
    [1]+ find / -perm +7000 &
    [1]+  Running                 find / -perm +7000 &

    可以观察到状态已经变为Runnig了,而且命令行最后多了一个“&”符号,表示该作业已经在后台启动了。


    6. 管理后台作业:kill

    kill -signal %jobnum
    kill -l
    option:
    -l:L的小写,列出当前kill能够使用的信号(signal)
    signal:表示给后面的作业什么指示,用man 7 signal可查看详细,常用的几个signal有:
    -1:重新读一次参数的设置文件,类似于reload
    -2:表示与由键盘输入ctrl+c一样的动作
    -9:立刻强制删除一个作业
    -15:以正常方式终止一项作业,与-9不一样

    如找出当前后台作业,并将其删除:

    [root@centos ~]# jobs
    [1]+  Stopped                 vi ~/.bashrcc
    [root@centos ~]# kill -9 %1
    
    [1]+  Stopped                 vi ~/.bashrcc
    [root@centos ~]# jobs
    [1]+  Killed                  vi ~/.bashrcc

    值得注意的是-9通常用于强制删除一个不正常的作业,-15则以正常步骤结束一项作业。

    kill的作用很多,可以通过-l(L的小写)参数查看相关的信号,常用的有1、9和15。


    三、参考

    《鸟哥的Linux私房菜_基础学习篇》(第二版)

    (完)

  • 相关阅读:
    关于使用stanfordcorenlp一直运行不报错的解决方法
    小程序项目报错
    小程序项目学习笔记
    如何将知网下载的caj文件转换为pdf文件
    干眼症治疗方法
    事务基础
    Android的四大组件
    异步任务AsyncTask使用解析
    Android Service的生命周期
    2016 校招, Android 开发,一个本科应届的坎坷求职之路(转)
  • 原文地址:https://www.cnblogs.com/harrymore/p/8794944.html
Copyright © 2020-2023  润新知