linux系统之进程管理

做~自己de王妃 提交于 2020-01-19 21:48:41

前言

我们拥有操作系统就是为了运行用户程序,程序的运行需要调动进程,因此进程管理就是所有操作系统的心脏。
实际上,进程就是正在执行的程序代码的时事结果。

进程的理解

  • 进程:
    进程是静态的文件,是运行中的程序的一个副本,且存在生命周期。
  • 进程状态:
状态 定义
R(TASK_RUNNING) 可执行状态(RUNNING,READY)
S(TASK_INTERRUPTIBLE) 可唤醒睡眠状态
D(TASK_UNINTERRUPTIBLE) 不可唤醒睡眠状态
T(TASK_STOPPED) 暂停状态
Z(EXIT_ZOMBIE) 僵死态

正在运行与就绪态的区别在于是否正在占用cpu的时间片

就绪态与可唤醒状态的区别在于是否在cpu运行的队列中

可唤醒与不可唤醒的区别在于是否拥有程序运行所需要的系统资源。

ctrl+z可使进程进入后台的暂停状态,一般暂停状态是人为操作的。

僵死态指这个进程无父进程给回收其系统资源,会造成系统资源浪费。

进程查看

  • 进程树pstree

    [root@workstation Desktop]# pstree
    systemd─┬─ModemManager───2*[{ModemManager}]
      	  ├─NetworkManager───2*[{NetworkManager}]
     	  ├─accounts-daemon───2*[{accounts-daemon}]
      ├─agetty
      ├─atd
      ├─auditd─┬─sedispatch
      │        └─2*[{auditd}]
      ├─avahi-daemon───avahi-daemon
      ├─boltd───2*[{boltd}]
      ├─chronyd
      ├─colord───2*[{colord}]
      ├─crond
      ├─cupsd
      ├─dbus-daemon───{dbus-daemon}
      ├─dnsmasq───dnsmasq
      ├─firewalld───{firewalld}
      ...
    

    进程:是资源调配的最小单位。
    线程:内核调度的对象,拥有独立的程序计数器、进程栈和一组进程寄存器。对于linux而言,线程是特殊的进程。也是进程运行的最小单位。
    systemd是守护进程。

  • ps命令(显示当前命令执行时进程状态)
    a 显示与终端相关进程(BSD)
    x 显示所有与终端无关进程(BSD)
    u 以用户为归类来显示进程状态信息(BSD)
    f 层级结构显示进程信息

    [root@workstation Desktop]# ps
        PID TTY          TIME CMD
       2499 pts/0    00:00:00 bash
       3273 pts/0    00:00:00 ps
    [root@workstation Desktop]# bash
    [root@workstation Desktop]# ps
        PID TTY          TIME CMD
       2499 pts/0    00:00:00 bash
       3288 pts/0    00:00:00 bash
       3326 pts/0    00:00:00 ps
    [root@workstation Desktop]# ps f
        PID TTY      STAT   TIME COMMAND
       2499 pts/0    Ss     0:00 bash
       3288 pts/0    S      0:00  \_ bash
    

    o 指定查看选项,pid,comm,nice,pri,pcpu,stat,ppid
    -e 显示所有进程(uinx)
    -f 显示完整格式信息(unix)
    -H 层级结构显示进程的相关信息
    -o 指定查看选项,pid,comm,nice,%cpu,%mem,nice

    [root@workstation Desktop]# ps axo pid,comm,nice,stat | less
        PID COMMAND          NI STAT
          1 systemd           0 Ss
          2 kthreadd          0 S
          3 rcu_gp          -20 I<
          4 rcu_par_gp      -20 I<
          6 kworker/0:0H-kb -20 I<
          8 mm_percpu_wq    -20 I<
          9 ksoftirqd/0       0 S
         10 rcu_sched         0 I
         11 migration/0       - S
         12 watchdog/0        - S
         13 cpuhp/0           0 S
         14 cpuhp/1           0 S
         15 watchdog/1        - S
    

    按照某个参数排序:

    [root@workstation Desktop]# ps axo pid,comm,%cpu --sort=%cpu(正序,倒序加-号)
        PID COMMAND         %CPU
          1 systemd          0.0
          2 kthreadd         0.0
          3 rcu_gp           0.0
          4 rcu_par_gp       0.0
          6 kworker/0:0H-kb  0.0
          8 mm_percpu_wq     0.0
          9 ksoftirqd/0      0.0
         10 rcu_sched        0.0
         ...
    
  • ps命令显示信息

     [root@workstation Desktop]# ps aux|less
     USER       PID %CPU %MEM    VSZ   RSS TTY      STAT START   TIME COMMAND
     root         1  0.1  0.7 244444 13744 ?        Ss   00:27   0:03 /usr/lib/systemd/systemd --switched-root --system --deserialize 17
     root         2  0.0  0.0      0     0 ?        S    00:27   0:00 [kthreadd]
     root         3  0.0  0.0      0     0 ?        I<   00:27   0:00 [rcu_gp]
     root         4  0.0  0.0      0     0 ?        I<   00:27   0:00 [rcu_par_gp]
     root         6  0.0  0.0      0     0 ?        I<   00:27   0:00 [kworker/0:0H-kblockd]
     root         8  0.0  0.0      0     0 ?        I<   00:27   0:00 [mm_percpu_wq]
     root         9  0.0  0.0      0     0 ?        S    00:27   0:00 [ksoftirqd/0]
     root        10  0.0  0.0      0     0 ?        R    00:27   0:00 [rcu_sched]
     root        11  0.0  0.0      0     0 ?        S    00:27   0:00 [migration/0]
     root        12  0.0  0.0      0     0 ?        S    00:27   0:00 [watchdog/0]
     root        13  0.0  0.0      0     0 ?        S    00:27   0:00 [cpuhp/0]
     root        14  0.0  0.0      0     0 ?        S    00:27   0:00 [cpuhp/1]
     ...
    

各个字段的解释如下表所示:

字段 解释
USER 用户名称
PID 进程id
%CPU cpu用量百分比
%MEM 内存用量百分比
VSZ 占用虚拟内存大小
RSS 常驻内存集大小
TTY 字符终端
STAT 进程状态
START 运行时间
TIME 占用cpu时间
COMMAND 进程名称
  • pgrep
    显示指定信息进程
    -u uid 显示指定用户进程
    -U name 显示指定用户进程
    -t tty 显示指定终端进程
    -l 显示进程名称
    -a 显示完整格式进程名
    -P pid 显示指定进程的子进程
    例如:

    [root@workstation Desktop]# id student
      uid=1000(student) gid=1000(student) groups=1000(student),10(wheel)
    [root@workstation Desktop]# pgrep -u 1000
      3831
    [root@workstation Desktop]# pgrep -l -u 1000
      3831 bash
    [root@workstation Desktop]# pgrep -l -U student
      3831 bash
    [root@workstation Desktop]# pgrep -l -t pts/1
      3791 bash
      3830 su
      3831 bash
    [root@workstation Desktop]# pgrep -la -t pts/1
      3791 bash
      3830 su - student
      3831 -bash
    [root@workstation Desktop]# pgrep -P 1
      621
      656
      799
      811
      863
      864
      868
      869
      871
      872
      875
      ...
      [root@workstation Desktop]# pgrep -aP 1
      621 /usr/lib/systemd/systemd-journald
      656 /usr/lib/systemd/systemd-udevd
      799 /usr/bin/rpcbind -w -f
      811 /sbin/auditd
      863 /usr/lib/systemd/systemd-machined
      864 /usr/sbin/mcelog --ignorenodev --daemon --foreground
      868 avahi-daemon: running [workstation.local]
      869 /usr/libexec/udisks2/udisksd
      871 /sbin/rngd -f
      872 /usr/libexec/rtkit-daemon
      875 /usr/sbin/smartd -n -q never
      ...
    
  • pidof(根据进程名称获取pid)
    例如:

    [root@workstation Desktop]# watch -n 1 date
    [root@workstation Desktop]# pidof watch
      4166
    [root@workstation Desktop]# ps aux|grep watch
      root        12  0.0  0.0      0     0 ?        S    00:27   0:00 [watchdog/0]
      root        15  0.0  0.0      0     0 ?        S    00:27   0:00 [watchdog/1]
      root        36  0.0  0.0      0     0 ?        S    00:27   0:00 [watchdogd]
      root      4166  0.0  0.1 223888  2844 pts/0    S+   01:42   0:00 watch -n 1 date
      root      4375  0.0  0.0 221864   972 pts/2    S+   01:42   0:00 grep --color=auto watch
    
  • top

      top - 01:46:39(当前系统时间) 
      up  1:19(当前系统运行时间),  
      1 user(当前系统有多少用户正在登录),  
      load average(系统负载): 0.10(一分钟内队列等待数), 0.04(五分钟), 0.01(十五分钟)
      Tasks(任务): 249 total(总数),   2 running(正在运行数), 247 sleeping,   0 stopped(暂停),   0 zombie
      %Cpu(s)(cpu使用量):  4.6 us(用户),  1.0 sy(内核),  0.0 ni(调整优先级), 94.1 id(空闲),  0.0 wa(等待输入输出时间),  0.2 hi(硬件中断时间),  0.0 si(软件中断时间),  0.2 st(被偷走的cpu量如虚拟机)
      MiB Mem(物理内存) :   1829.1 total,    211.9 free,   1003.3 used,    613.9 buff/cache(缓存)
      MiB Swap(交换内存):      0.0 total,      0.0 free,      0.0 used.    640.1 avail Mem 
      PID(进程号)
      USER(用户)
      PR(优先级)
      NI(优先级代表的nice值)
      VIRT(vsz虚拟内存)
      RES(常驻内存地址)
      SHR(共享资源)
      S(状态)
      %CPU(cpu用量)
      %MEM(内存用量)
      TIME+ COMMAND(cpu时间即命令名称) 
    

    top内部参数:

    P cpu百分比排序
    M 内存百分比
    T 累计占用cpu时间
    l 开启/关掉uptime信息
    t 开启/关闭task&cpu信息
    s 调整刷新频率
    k 终止进程
    u 查看指定用户进程

    == top命令参数:==

    -d 指定刷新间隔
    -b 以批次方式显示
    -n 显示批次数量

进程优先级

进程对资源占有的先后顺序

  • 按照资源占用划分进程类型
资源使用量 进程类型
cpu使用密集 CPU-Bound
I/O使用密集 I/O-Bound
  • 优先级范围
    对Linux而言优先级被划分成固定个数(0-139)
    1-99为实时有优先级,数字越大优先级越高,不用手动处理系统自用
    100-139为静态优先级,数字越小优先级越高

  • NICE值
    NICE值:-20~19对应静态优先级100~139
    普通用户只可以调低优先级,超级用户任意调整
    关于优先级的命令
    • ps ax –o nice,pid,comm
    • nice –n 优先级 程序
    • reince–n 优先级 程序pid
    例如:

    [root@workstation Desktop]# vim
      
      [1]+  Stopped                 vim
    [root@workstation Desktop]# ps -o stat,nice,comm,pid
      STAT  NI COMMAND           PID
      Ss     0 bash             2499
      S      0 bash             3288
      T      0 vim              5343
      R+     0 ps               5350
    

    升高nice值并查看:

    [root@workstation Desktop]# renice -n -10 5343
      5343 (process ID) old priority 0, new priority -10
    [root@workstation Desktop]# ps -o stat,nice,comm,pid
      STAT  NI COMMAND           PID
      Ss     0 bash             2499
      S      0 bash             3288
      T<   -10 vim              5343
      R+     0 ps               5373
    

    降低nice值并查看:

    [root@workstation Desktop]# renice -n 10 5343
      5343 (process ID) old priority -10, new priority 10
    [root@workstation Desktop]# ps -o stat,nice,comm,pid
      STAT  NI COMMAND           PID
      Ss     0 bash             2499
      S      0 bash             3288
      TN    10 vim              5343
      R+     0 ps               5395
    

    打开vim并放入后台不占用终端:

    [root@workstation Desktop]# vim &
      [2] 5474
    [root@workstation Desktop]# ps -o stat,nice,comm,pid
      STAT  NI COMMAND           PID
      Ss     0 bash             2499
      S      0 bash             3288
      TN    10 vim              5343
      T      0 vim              5474
      R+     0 ps               5481
      
      [2]+  Stopped                 vim
    

    指定优先级并放入后台:

    [root@workstation Desktop]# nice -n 5 vim &
      [3] 5511
    [root@workstation Desktop]# ps -o stat,nice,comm,pid
      STAT  NI COMMAND           PID
      Ss     0 bash             2499
      S      0 bash             3288
      TN    10 vim              5343
      T      0 vim              5474
      TN     5 vim              5511
      R+     0 ps               5518
      
      [3]+  Stopped                 nice -n 5 vim
    

进程前后台调用

相关命令:

指令 含义
jobs 查看后台任务
ctrl+z 将前台运行任务打入后台
bg 激活后台进程
fg 调回进程
& 运行在后台

例如:

[root@workstation Desktop]# jobs
[1]   Stopped                 vim
[2]-  Stopped                 vim
[3]+  Stopped                 nice -n 5 vim

开启图形编辑并放入后台:

[root@workstation Desktop]# gedit
  ^Z
  [4]+  Stopped                 gedit
[root@workstation Desktop]# jobs
  [1]   Stopped                 vim
  [2]   Stopped                 vim
  [3]-  Stopped                 nice -n 5 vim
  [4]+  Stopped                 gedit

激活后台可唤醒暂停进程:

[root@workstation Desktop]# bg 4
  [4]+ gedit &
[root@workstation Desktop]# jobs
  [1]   Stopped                 vim
  [2]-  Stopped                 vim
  [3]+  Stopped                 nice -n 5 vim
  [4]   Running                 gedit &

激活后台不可唤醒暂停进程:

[root@workstation Desktop]# bg 1
[1] vim &

[1]+  Stopped                 vim
bg在此不可使用	
[root@workstation Desktop]# fg 1
vim
[root@workstation Desktop]# jobs
[2]-  Stopped                 vim
[3]+  Stopped                 nice -n 5 vim

信号

  • 可控信号类型
    man 7 signal查看所有信号信息
可控信号 含义
1 刷新
2 中断键盘输入
3 退出键盘
9 强制结束
15 正常关闭
18 激活进程
19 强制暂停
20 正常暂停
  • 信号指令
    kill 信号 pid

    [root@workstation Desktop]# gedit &
    [1] 9662
    [root@workstation Desktop]# kill -9 9662
    [1]+  Killed                  gedit
    

    killall 信号 进程名称

    [root@workstation Desktop]# gedit &
    [1] 9628
    [root@workstation Desktop]# killall -9 gedit
    [1]+  Killed                  gedit
    

    pkill 信号 条件(可以–help去查看)

    与pgrep很相似,例如:
    [root@workstation Desktop]# su - student
    Last login: Sun Jan 19 01:30:16 EST 2020 on pts/1
    

    打开新的一个shell:

    [root@workstation Desktop]# pkill -u 1000
    

    原shell:

    [student@workstation ~]$ logout
    

系统守护进程

  • 守护进程的定义
    守护进程就是通常讲Daemon进程,是linux后台执行的服务进程。它独立于控制终端、周期性地执行某种任务或等待处理某些发生事件,不会随终端关闭而停止,直到接受停止信息才会结束。

后记

需要配置网络,才可以做守护进程的实验,所以暂时无法做。

易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!