zoukankan      html  css  js  c++  java
  • 进程控制

    进程控制

    参考:

    https://program-think.blogspot.com/2019/11/POSIX-TUI-from-TTY-to-Shell-Programming.html?q=bash&scope=all

     一般来说,每个“进程”都是由另一个进程启动滴。如果“进程A”创建了“进程B”,则 A 是【父进程】,B 是【子进程】(这个“父子关系”很好理解——因为完全符合直觉)
      一般来说,第一个进程由【操作系统内核】(kernel)亲自操刀运行起来;而 kernel 又是由“引导扇区”中的“boot loader”加载。通过pstree来查看进程数,通过 -p 参数来查看pid

    [root@chz Desktop]# pstree
    systemd─┬─ModemManager───2*[{ModemManager}]
            ├─NetworkManager───2*[{NetworkManager}]
            ├─VGAuthService
            ├─2*[abrt-watch-log]
            ├─abrtd
            ├─accounts-daemon───2*[{accounts-daemon}]
            ├─alsactl
            ├─at-spi-bus-laun─┬─dbus-daemon───{dbus-daemon}
            │                 └─3*[{at-spi-bus-laun}]
            ├─at-spi2-registr───2*[{at-spi2-registr}]
            ├─atd
            ├─auditd─┬─audispd─┬─sedispatch
            │        │         └─{audispd}
            │        └─{auditd}
    

    进程终止的信号

    我们可以通过kill -l 来查看所有的信号,数字对应编号,使用名称时可以省略SIG

    • SIGINT

      在大部分 POSIX 系统的各种终端上,Ctrl + C 组合键触发的就是这个信号。通常情况下,进程收到这个信号后,做完相关的善后工作,就自行了断(自杀)。

    • SIGTERM

      这个信号基本类似于 SIGINT。它是 killkillall 这两个命令【默认】使用的信号。也就是说,当你用这俩命令杀进程,并且【没有】指定信号类型,那么 killkillall 用的就是这个 SIGTERM 信号。

    • SIGQUIT

      这个信号类似于前两个(SIGINT & SIGINT),差别在于——进程在退出前会执行“core dump”操作。
      一般而言,只有程序员才会去关心“core dump”这个玩意儿,所以这里就不细聊了。

    • SIGKILL

      在杀进程的几个信号中,这个信号是是最牛逼的(也是最粗暴的)。前面三个信号都是【可屏蔽】滴,而这个信号是【不可屏蔽】滴。当某个进程收到了【SIGKILL】信号,该进程自己【完全没有】处理信号的机会,而是由操作系统内核直接把这个进程干掉。此种行为可以形象地称之为“它杀”。当你用下列这些命令杀进程,本质上就是在发送这个信号进行【它杀】。【SIGKILL】这个信号的编号是 9,下列这些命令中的 -9 参数就是这么来滴。

      kill -9 进程号
      kill -KILL 进程号
      
      killall -9 进程名称
      killall -KILL 进程名称 
      killall -SIGKILL 进程名称
      

     为了方便对照上述这4种,俺放一个表格如下

    信号名称 编号 能否屏蔽 默认动作 俗称
    SIGINT 2 YES 进程自己退出 自杀
    SIGTERM 15 YES 进程自己退出 自杀
    SIGQUIT 3 YES 执行core dump进程自己退出 自杀
    SIGKILL 9 NO 进程被kernel干掉 他杀

    请注意他杀是一种比较危险的做法,可能导致一些副作用,只有在使用其他方法无法干掉某个进程,才考虑用这招

    例如:

    某个进程正在保存文件。这时候遭遇“它杀”可能会导致文件损坏。
      (注:虽然某些操作系统能做到“写操作的原子性”,但数据存储可能会涉及多个写操作。当进程在作【多个】关键性写操作时,遭遇它杀。可能导致数据文件【逻辑上】的损坏)

    kill vs killall

    两者差别在于--前者使用进程号,后者使用进程名

    [root@chz Desktop]# firefox &
    [1] 22518
    [root@chz Desktop]# kill 22518
    [1]+  Terminated  
    
    [root@chz Desktop]# killall firefox
    [1]+  Terminated              firefox
    

    进程暂停

    暂停的进程将失去响应

    • 温柔式暂停(SIGTSTP)

      kill -TSTP <pid>
      

      【SIGTSTP】默认绑定到组合键【Ctrl + Z】,是【可】屏蔽的信号。也就是说,如果某个进程屏蔽了【SIGTSTP】信号,你就【无法】用该方式暂停它。这时候你就得改用【粗暴】的方式

    • 粗暴式暂停(SIGSTOP)

      kill -STOP <pid>
      

      这个【SIGSTOP】信号与前面提及的【SIGKILL】有某种相同之处——这两个信号都属于【不可屏蔽】的信号。也就是说,收到【SIGSTOP】信号的进程【无法】抗拒被暂停(suspend)的命运。

    恢复进程

    如果想要resume被暂停的进程使用【SIGCONT】

    kill -CONT <pid>
    

    ps VS top

    • ps 显示的是当前正在运行的进程的快照,top动态显示
    • top显示的字段与ps -aux差不多
  • 相关阅读:
    maven项目诡异的问题
    13) Developing Java Plugins
    15) maven dependency scope
    Bootstrap学习记录
    电力
    MongoDB学习记录
    Java基础知识
    旅游
    人生感悟
    【转】25岁到55岁:如何规划人生最重要的三个十年
  • 原文地址:https://www.cnblogs.com/kikochz/p/13800192.html
Copyright © 2011-2022 走看看