linux进程管理

Linux进程管理

  • 什么是程序:应用程序是用户选择安装的程序的总称,通常包括驱动程序的进程,看图软件、解压缩软件等通用软件的进程.也可以顾名思义地说:应用程序就是为使用者提供与电脑沟通所开发出来的程序软件

  • 什么是进程:

    狭义定义:进程就是一段程序的执行过程。

    广义定义:进程是一个具有一定独立功能的程序关于某个数据集合的一次运行活动。它是操作系统动态执行的基本单元,在传统的操作系统中,进程既是基本的分配单元,也是基本的执行单元。

  • 什么是线程:也叫做轻量级进程,线程是进程中的⼀个执⾏单元,负责当前进程中程序的执⾏,⼀个进程中⾄少有⼀个线程。⼀个进程中是可以有多个线程的,这个应⽤程序也可以称之为多线程程序。

【1】、查看进程树

  • pstree:以树状结构显示进程信息,包括进程之间的关系

  • option

    • -p:显示进程PID

    • -a:显示完整的命令行

    • -u:列出每个进程所属账号名称

      可以查看每一个进程是由哪些账号开启的,进程要一直开启才可以看到,进程有生命周期

通过pstree命令可以去进行进程的查询。

可以通过用户查询

pstree -p 用户名

  • ps aux :unix格式静态查看系统进程,查看系统所有进程信息

    • a:显示当前终端所有进程

    • u:以用户格式输出

    • x:当前用户在所有终端下的进程

    sh 复制代码
    [root@bogon ~]# ps aux
    USER         PID %CPU %MEM    VSZ   RSS TTY      STAT START   TIME COMMAND
    root           1  0.1  0.3 241428 14348 ?        Ss   04:21   0:02 /usr/lib/systemd/systemd --switched-root --system --deserialize 17
    • 各个字段的含义

    sh 复制代码
    USER:进程属于哪个用户
    PID:进程ID号
    %CPU:该进程占用CPU的百分比
    %MEN:该进程占用物理内存的百分比
    VSZ:进程使用掉的虚拟内存量(单位:kb)
    TTY:表示进程在那个终端运行,如果内核直接调用则显示"?",tty1-tty6表示本机终端登录的用户进程,pts/0-255则表示远程终端登录用户的进程
    STAT:进程状态,R(running)运行,S(sleep)睡眠,s包含子进程,T(stop)停止,Z(zombie)僵尸进程, +后台进程
    START:进程启动时间
    TIME:占用CPU运算时间
    COMMAND:产生此进程的命令
  • ps ef :unix格式静态查看系统进程,查看系统所有进程信息

    • -e:显示当前终端所有进程

    • -f:显示最完整的进程信息

    • -l:以长格式输出

    • 查找僵尸进程

    sh 复制代码
    [root@bogon ~]# ps -e -o ppid,stat | grep Z

【2】、top命令

sh 复制代码
Tasks: 256 total,   1 running, 255 sleeping,   0 stopped,   0 zombie
		进程总数	正在运行的进程  休眠进程数		停止进程数		僵尸进程数

第一行:

系统本地时间

系统运行时间

用几个用户在登录

负载情况

  • -M:按照内存使用资源排序
  • -P:按照CPU使用资源排序

【3】、进程的前后台调度

  • 前台任务

    会持续占据终端界面,直至任务的结束才会释放终端界面,在前台任务占据终端界面时,我们是不能进行任何操作的

  • 后台任务

    在后台运行的任务不会占据控制界面,我们可以执行其他的命令

  • &:将程序fangruhoutaiyunx

  • jobs -l:查看后台任务列表

  • fg 进程编号:将后台任务恢复到前台执行

  • CTRL+Z:挂起前台任务并且放入后台

  • bg 进程编号:激活后台被挂起的进程

sh 复制代码
[root@bogon ~]# ping baidu.com >> /dev/null &
[1] 3230
#将进程放入后台执行
[root@bogon ~]# jobs -l
[1]+  3230 Running                 ping baidu.com >> /dev/null &
#查看后台进程
[root@bogon ~]# fg 1
ping baidu.com >> /dev/null
#将后台进程放入前台执行
^Z
#挂起前台任务,并放入后台
[1]+  Stopped                 ping baidu.com >> /dev/null
[root@bogon ~]# bg 1
#激活
[1]+ ping baidu.com >> /dev/null &
[root@bogon ~]# jobs -l
[1]+  3230 Running                 ping baidu.com >> /dev/null &

【4】、杀死进程

  • CTRL+C:结束当前命令程序,只能杀死前台任务,后台任务没法杀

  • kill

    • 按照PID杀死,精确的杀死一个进程

    • -l:列出可选择的信号

    • 常用信号:

      -1:重启

      -9:强制杀死,直接杀死,例如杀死僵尸进程

      -15:正常杀死,默认是-15,杀死进程时先终止,后杀死

    sh 复制代码
    [root@bogon logs]# jobs -l
    [1]   3628 Running                 sleep 2m &
    [2]-  3629 Running                 sleep 3m &
    [3]+  3630 Running                 sleep 4m &
    [root@bogon logs]# kill 3628
    [root@bogon logs]# jobs -l
    [1]   3628 Terminated              sleep 2m
    [2]-  3629 Running                 sleep 3m &
    [3]+  3630 Running                 sleep 4m &
    [root@bogon logs]# jobs -l
    [2]-  3629 Running                 sleep 3m &
    [3]+  3630 Running                 sleep 4m &
    [root@bogon logs]# jobs -l
    [2]-  3629 Running                 sleep 3m &
    [3]+  3630 Running                 sleep 4m &
    [root@bogon logs]# kill -9 3630
    [root@bogon logs]# jobs -l
    [2]-  3629 Running                 sleep 3m &
    [3]+  3630 Killed                  sleep 4m
    [root@bogon logs]# jobs -l
    [2]+  3629 Running                 sleep 3m &
  • killall

    • 依据进程名杀死进程

    • killall 进程名

    sh 复制代码
    [root@bogon logs]# jobs -l
    [1]   3673 Running                 sleep 5m &
    [2]-  3674 Running                 sleep 6m &
    [3]+  3675 Running                 sleep 7m &
    [root@bogon logs]# killall sleep 
    [1]   Terminated              sleep 5m
    [2]-  Terminated              sleep 6m
    [3]+  Terminated              sleep 7m
    [root@bogon logs]# jobs -l 
    • 强制杀死某用户所有的进程

      sh 复制代码
      killall -9 -u 用户名
  • pkill

    • 按照终端杀死进程,-t

【5】、nice值

  • 每一个进程都会拥有一个"优先级(priority)"属性
  • 通过改变nice值,修改进程优先级
  • nice值的范围是-20~19,nice值越低优先级越高,nice默认值是0、
  • nice:在创建进程时设置nice值
  • renice:创建好进程后,重新设置nice值
sh 复制代码
[kiosk@foundation0 ~]$ ps efo  pid,command,nice
    PID COMMAND                      NI
   5890 bash SYSTEMD_EXEC_PID=2335    0
   3058 bash SYSTEMD_EXEC_PID=2335    0
   8949  \_ ps efo pid,command,nice   0
   2245 /usr/libexec/gdm-wayland-se   0
   2254  \_ /usr/libexec/gnome-sess   0

# 普通用户对于nice值只能调高(优先级只能调低),root用户对于nice值既可以调高,也可以调低
[root@servera ~]# nice -n 19 ping 127.0.0.1 > /dev/null &
[root@servera ~]# ps efo pid,command,nice
    PID COMMAND                      NI
   1519 sudo -i SHELL=/bin/bash HIS   0
   1523  \_ -bash HISTSIZE=1000 HOS   0
   1545      \_ ping 127.0.0.1 SHEL  19
   1546      \_ ps efo pid,command,   0
   1078 /sbin/agetty -o -p -- \u --   0
   1065 /sbin/agetty -o -p -- \u --   0
[root@servera ~]# renice -n 10 1545
1545 (process ID) old priority 19, new priority 10
[root@servera ~]# ps efo pid,command,nice
    PID COMMAND                      NI
   1519 sudo -i SHELL=/bin/bash HIS   0
   1523  \_ -bash HISTSIZE=1000 HOS   0
   1545      \_ ping 127.0.0.1 SHEL  10
   1548      \_ ps efo pid,command,   0
   1078 /sbin/agetty -o -p -- \u --   0
   1065 /sbin/agetty -o -p -- \u --   0
   
# 普通用户不允许调低nice值,也就是不允许将进程的优先级调高
[student@servera ~]$ ping 127.0.0.1 > /dev/null &
[1] 1577
[student@servera ~]$ 
[student@servera ~]$ 
[student@servera ~]$ ps efo pid,command,nice
    PID COMMAND                      NI
   1501 -bash USER=student LOGNAME=   0
   1577  \_ ping 127.0.0.1 SHELL=/b   0
   1578  \_ ps efo pid,command,nice   0
[student@servera ~]$ renice -n 14 1577
1577 (process ID) old priority 0, new priority 14
[student@servera ~]$ ps efo pid,command,nice
    PID COMMAND                      NI
   1501 -bash USER=student LOGNAME=   0
   1577  \_ ping 127.0.0.1 SHELL=/b  14
   1581  \_ ps efo pid,command,nice   0
[student@servera ~]$ renice -n 8 1577
renice: failed to set priority for 1577 (process ID): Permission denied