首页 > 代码库 > Linux进程管理

Linux进程管理

1、  进程管理的基础概念

  1. 什么是进程

顾名思义,进程是指当前系统运行的程序,每个进程有唯一的标识符PID,进程由内核管理通过task_strucktask_list来调度和管理的。

  1. 内核的定义及功能

内核是操作系统的核心,控制的计算机的基本硬件,所有程序和CPU、内存等计算机硬件通讯都需要向内核申请。内核负责进程管理、文件系统、网络功能、内存管理、驱动程序、安全功能。

  1. 进程创建

Linux所有进程都是通过init创建,init是所有进程的父进程,父进程的子进程必须又父进程来关闭,如果父进程被关闭,子进程也会被关闭。进程创建方法由三种:fork()clone()vfork()fork()通过克隆的方式创建子进程,但是子进程拥有自己的结构和 PID,修改子进程的配置文件,并不会影响父进程;系统调用fork()vfork()是无参数的,而clone()则带有参数,clone()会有选择的将父进程的资源复制给子进程,没有复制的部分将通过指针共享;vfork()创建的子进程会与父进程共享空间和资源,子进程的变量修改会直接影响父进程。

  1. 进程优先级

进程的优先级在系统中通过数字0-139表示,数字越小优先级越高。

0:为所有进程的父进程

1-99:显示进程的实时优先级,为内核调度,动态分配

100-139:显示进程的静态优先级

Nice值:调整进程静态优先级,nice值范围为-2019,依次对应100-139,负值为高优先级,正值为低优先级,0表示不调整优先级。

  1. 进程通信(Inter process communication

同主机通过singnal(信号)、shared memory(共享内存)、semerphore(旗语)来通讯,如果不在同意主机上需要通过remote procecure callRPC远程通讯协议)、socket(套接字)来通信。

  1. 进程管理机制

Linux内核的特点是Preemption(抢占)多任务运行,这种抢占不需要征求正在运行的进程的同意而强制打断。

进程的类型分为一下两种:

守护进程:在系统引导过程中启动的进程,跟终端无关,一般称之为后台进程;

前台进程:跟终端相关,通过终端启动的进程,一般称之为前台进程,可以将前台进程送往后台,以守护模式运行

进程运行状态主要有以下几种:

running:运行态

ready:就绪态

睡眠态:睡眠态分为interruptable(可中断睡眠)和uninterruptable(不可中断睡眠),可中断睡眠表示随时可以唤醒的,不可中断失眠表示不能随时唤醒的,一般不可中断睡眠发生在外部条件不满足,无法继续进行时,例如磁盘I/O的时候。

stopped:停止态,暂停于内存中,但不会被调度,除非手动启动

zomble:僵死态,每个进程都由其父进程创建,子进程销毁后由父进程进行回收,但是父进程被销毁于子进程之前,则该子进程被称为僵死进程。

进程分类:

CPU-Bound:计算密集型,只大部分时间用来计算,I/O一直处于等待中的较多;

IO-Bound:只CPU一直出于等待中中,IO频率较高。

 

2、  进程查看管理工具详解

常用的进程管理命令和工具有pstreepspidoftophtopglancespmapvmstatdstatkillpkilljobbgfgnohup

 

2.1 pstree

   功能:使用树型显示进程

   用法:pstree

   示例:

[root@localhost ~]# pstree

systemd─┬─ModemManager───2*[{ModemManager}]

        ├─NetworkManager─┬─dhclient

                        └─2*[{NetworkManager}]

        ├─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───{at-spi2-registr}

        ├─atd

        ├─auditd─┬─audispd─┬─sedispatch

                         └─{audispd}

                └─{auditd}

        ├─avahi-daemon───avahi-daemon

        ├─bluetoothd

        ├─caribou───2*[{caribou}]

        ├─colord───2*[{colord}]

        ├─crond

        ├─cupsd

        ├─2*[dbus-daemon───{dbus-daemon}]

        ├─dbus-launch

        ├─dconf-service───2*[{dconf-service}]

        ├─dnsmasq───dnsmasq

        ├─evolution-calen───5*[{evolution-calen}]

        ├─evolution-sourc───2*[{evolution-sourc}]

        ├─firewalld───{firewalld}

        ├─gconfd-2

        ├─gdm─┬─Xorg

             ├─gdm-session-wor─┬─gnome-session─┬─abrt-applet───{abrt-applet}

                                             ├─gnome-settings-───4*[{gnome-settings-}]

                                             ├─gnome-shell─┬─ibus-daemon─┬─ibus-dconf───3*[{ibus-dconf}]

                                                                       ├─ibus-engine-sim───2*[{ibus-engine-sim}]

                                                                       └─2*[{ibus-daemon}]

                                                          └─6*[{gnome-shell}]

                                             ├─gnome-software───3*[{gnome-software}]

                                             ├─nautilus───3*[{nautilus}]

                                             ├─seapplet

                                             ├─ssh-agent

                                             ├─tracker-extract───13*[{tracker-extract}]

                                             ├─tracker-miner-a───2*[{tracker-miner-a}]

                                             ├─tracker-miner-f───3*[{tracker-miner-f}]

                                             ├─tracker-miner-u───2*[{tracker-miner-u}]

                                             └─3*[{gnome-session}]

                              └─2*[{gdm-session-wor}]

             └─3*[{gdm}]

        ├─gnome-keyring-d───4*[{gnome-keyring-d}]

        ├─gnome-shell-cal───4*[{gnome-shell-cal}]

        ├─gnome-terminal-─┬─bash

                         ├─gnome-pty-helpe

                         └─3*[{gnome-terminal-}]

        ├─goa-daemon───3*[{goa-daemon}]

        ├─goa-identity-se───2*[{goa-identity-se}]

        ├─gsd-printer───{gsd-printer}

        ├─gssproxy───5*[{gssproxy}]

        ├─gvfs-afc-volume───2*[{gvfs-afc-volume}]

        ├─gvfs-goa-volume───{gvfs-goa-volume}

        ├─gvfs-gphoto2-vo───{gvfs-gphoto2-vo}

        ├─gvfs-mtp-volume───{gvfs-mtp-volume}

        ├─gvfs-udisks2-vo───2*[{gvfs-udisks2-vo}]

        ├─gvfsd───{gvfsd}

        ├─gvfsd-fuse───4*[{gvfsd-fuse}]

        ├─gvfsd-metadata───{gvfsd-metadata}

        ├─gvfsd-trash───2*[{gvfsd-trash}]

        ├─httpd───5*[httpd]

        ├─ibus-x11───2*[{ibus-x11}]

        ├─ksmtuned───sleep

        ├─libvirtd───15*[{libvirtd}]

        ├─lsmd

        ├─lvmetad

        ├─master─┬─pickup

                └─qmgr

        ├─mission-control───2*[{mission-control}]

        ├─packagekitd───2*[{packagekitd}]

        ├─polkitd───5*[{polkitd}]

        ├─pulseaudio───2*[{pulseaudio}]

        ├─rngd

        ├─rsyslogd───2*[{rsyslogd}]

        ├─rtkit-daemon───2*[{rtkit-daemon}]

        ├─smartd

        ├─sshd───sshd───bash───pstree

        ├─systemd-journal

        ├─systemd-logind

        ├─systemd-udevd

        ├─tracker-store───7*[{tracker-store}]

        ├─tuned───4*[{tuned}]

        ├─udisksd───4*[{udisksd}]

        ├─upowerd───2*[{upowerd}]

        ├─vmtoolsd───{vmtoolsd}

        ├─vmtoolsd

        └─wpa_supplicant

 

2.2 pstree

   用途:report a snapshot of the current processes(当前进程快照的报告)

   语法:ps [option]…

   选项:

     常用组合:aux

       u:以用户为中心组织进程状态信息的显示

            a:与用户终端相关的进程

       x:与用户终端无关的进程

     [root@localhost ~]# ps aux

USER        PID %CPU %MEM    VSZ   RSS TTY      STAT START   TIME COMMAND

     命令显示内容解析:

       VSZ: Virtual memory Size ,虚拟内存集

       RSS: Resident size    ,常驻内存集

       STAT:进程状态

          Rrunning,运行态

          Sinterruptable sleeping,可中断睡眠

          Duninterruptable sleeping,不可中断睡眠

          Tstopped,停止态

          Zzamble,僵死态

         

          +:前台进程

          l:多线程进程

          N:低优先级进程

          <:高优先级进程

          ssession leader

 

     常用组合:-ef

            -e : 显示所有的进程

       -f :显示完整格式的程序信息

 

     常用组合:-eFH

       -F : 显示完整格式的进程信息

       -H : 以进程层级格式显示进程的相关信息

 

     常用组合:-eo,axo

       -eo : pid , tid , class , rtprio , ni ,pri , psr , pcup , stat , comm

       -axo : stat,euid,ruid,tty,tpgid,sess,pgrp,ppid,pid,pcpu,comm

            ni: nice

            pri : priority ,优先级

            prs: processor ,cpu

            rtprio:实时优先级

 

2.2 pgreppkill

         用途:

                   pgrep : 以名称为依据显示对应进程的PID

                   pkill:杀死运行中的进程

         格式:

pgrep[ option ] pattern

pkill [ option ] pattern

         选项:

                   -u uid effective user

                   -U uid real user

                   -t terminal : 与指定终端相关的进程

                   -l :显示进程名

                   -a 显示完整格式的进程名

                   -p pid : 显示其父进程为此处指定的进程的进程列表

 

2.3 pidof

         用途:根据进程名获取其PID

 

2.4 top

         内置命令

                   排序

                            P:以占据的CPU显示百分比

                            M:以占据的内存百分比

                            T:累计占据CPU时长

 

                   首部信息显示

                            Uptime信息:l

                            taskCPU信息:t

                                     CPU分别显示:1

                            Memory信息:m

                  

                   退出命令:q

                   更改刷新时间:s

                   杀死进程:k

 

         选项:

                   -d:指定刷新间隔,默认为3s

                   -b:以批次方式显示

                   -n #:显示多少批次

 

2.5 htop

         用途:功能和top一样,但是更强大,显示更直观。

         安装方法:htop并不是centos自带工具,需要配置EPEL源,然后使用yum安装,安装过程如下:

/etc/yum.repos.d目录下新建一个以.repo结尾的文件,例如CentOS-EPEL.repo

[root@localhost yum.repos.d]# vi /etc/yum.repos.d/CentOS-EPEL.repo

[EPEL]               ####yum源描述

name=EPEL          ####yum源名称

baseurl=http://dl.fedoraproject.org/pub/epel/7/x86_64/  ####yum源地址

gpgcheck=0       ####是否检查检查来源合法性,0为不检查,1为检查

enable=1         ####是否启用此yum

                            yum –y install htop

        

         选项:

                   -d #:指定刷新时间间隔,默认为3s

                   -b:以批次方式显示

                   -n # :显示多少批次

        

         命令:

                   s:跟踪选定进程的系统调用

                   l:显示选定进程打开的文件列表

                   a:将进程绑定在指定CPU核心上

                   t:显示进程树

 

2.5 vmstat

         用途:报告虚拟内存状态

         格式:vmstat [ options ] [ delay [ conut ] ]

[root@localhost yum.repos.d]# vmstat

procs ----------------memory------------------ ---swap-- -----io------------ -system-- ------cpu-----

 r  b   swpd   free   buff  cache   si   so    bi    bo   in   cs us sy id wa st

 3  0      0 876260   1368 638152  0    0     8    2    43   70  0  0 99  0  0

        

procs:

         r:等待运行的进程个数

         b:出于不可中断睡眠的进程个数(被阻塞的队列长度)

memeory
                   swpd
:交换分区的使用总量

         free:空闲的物理内存总量

         buffer:用于buffer的内存总量

         cache:用于cache的内存总量

swap

         si:数据进入swap中的数据速率(kb/s

         so:数据离开swap中的数据速率(kb/s

io

         bi:从块设备读取数据的速率(kb/s

         bo:保存数据到数据块的速率(kb/s

system

         cscentext switch):进程切换的速率

         ininterrupts):中断速率

cpu

         us:用户空间

         sy:内核空间

         id:空闲比例

         wa:等待运行进程的个数

         st:别虚拟化占据的时间比例

         选项:

                   -s:显示内存的统计数据

 

2.6 pmap命令

         用途:报告进程占用内存空间的明细图

         格式:pmap [ option ] pid [ … ]

         选项:

                   -x:显示详细格式的信息

         也可通过 cat /proc/PID/maps来查看,功能等同于pmap

 

2.7 glances

         用途:监控本地或远程主机系统的CPU、内存、交换分区、网络、进程等相关参数。

         安装:需要先配置EPEL源,然后使用yum安装,EPEL配置方法请参考2.5

         格式:glances [-bdehmnrsvyz1] [-B bind] [-c server] [-C conffile] [-p port] [-P password] [--password] [-t refresh] [-f file] [-o output]

         内建命令

                a  Sort processes automatically     l  Show/hide logs

                 c  Sort processes by CPU%         b  Bytes or bits for network I/O

                m  Sort processes by MEM%       w  Delete warning logs

                p  Sort processes by name         x  Delete warning and critical logs

                 i  Sort processes by I/O rate        1  Global CPU or per-CPU stats

                 d  Show/hide disk I/O stats         h  Show/hide this help screen

                f  Show/hide file system stats          t  View network I/O as combination

                n  Show/hide network stats           u  View cumulative network I/O

                s  Show/hide sensors stats            z  Show/hide processes list

                y  Show/hide hddtemp stats          q  Quit (Esc and Ctrl-C also work)      

 

         常用选项:

                   -b :以byte为单位显示网卡速率

                   -d :关闭磁盘I/O模块

                   -f  /path/to/somfile :设定输入文件的位置

                   -o HTML|CSV:输出格式

                   -m:禁用mount模块

                   -n:禁用网络模块

                   -t #:延时时间间隔

                   -1:每个cpu的相关数据单独显示

        

         C/S模式下glances使用方法:

                   服务模式:

[root@localhost ~]# glances -s -B IPADDR(本地监听的IP地址)

Glances server is running on IPADDR:61209

                   客户端模式:

            [root@localhost ~]# glances -c IPADDR(服务端IP地址)

 

2.8 dstat

         用途:生成系统资源统计

         格式:dstat [-afv] [options..] [delay [count]]

         生成信息解析:

[root@localhost ~]# dstat

You did not select any stats, using -cdngy by default.

----total-cpu-usage---- -dsk/total- -net/total- ---paging-- ---system--

usr sys idl wai hiq siq| read  writ| recv  send|  in   out | int   csw

                0   0  99   0   0   0|6504B 1665B|   0     0 |   0     0 |  43    68

                 0   1  99   0   0   0|   0     0 | 180B  934B|   0     0 |  35    47

                0   0 100   0   0   0|   0     0 |  60B  346B|   0     0 |  29    31    

                   Total cpu usage          

                            usr:用户空间            

                            sys:内核空间            

                            idl:空闲比例

                            hiq:硬中断次数

                            siq:软中断次数

                   dsk/total

                            read:从块设备读取数据的速率

                            writ:数据写入块设备的速率

                   net/total

                            recv:当前网络接收数据包接受的速率,以kb/s为单位

                            send:当前网络发送数据包的速率,以kb/s为单位

                   paging

                            in:换进

                            out:换出

                   system

                            int:系统中断次数

                            csw:安全上下文切换次数

         选项:

                   -c:显示CPU相关统计数据

                   -C:当cpu有多个是可以使用 –C 0,1…total分别显示多块cpu状态

                   -d:显示硬盘相关信息

                   -D:当硬盘有多块时可以使用 –D hda1,…,total分别显示多块硬盘状态

                   -g:显示page相关统计数据

                   -m:显示memory相关统计数据

                   -n:显示network相关统计数据

                   -p:显示process相关统计数据

                   -r:显示IO相关统计数据

                   -s:显示swapped相关的统计数据

 

                   --tcp:显示TCP协议相关统计数据

                   --udp:显示UDP协议相关的统计数据

                   --unix:显示unix协议相关的统计数据

                   --socket:显示套接字相关的统计数据

                  

                   --top-tcp:显示CPU占用最高的进程

                   --top-mem:显示内存占用最高的进程

                   --top-io:显示IO占用最高的进程

                   --top-lantency:显示最大延迟的进程

                  

                   --out-file /path/to/file.csv:可以将信息输出至指定的csv文件便于以后查看。

 

2.9 kill

         用途:向进程发送控制信号,以实现对进程的管理

         显示当前系统可用信号:

                   # kill -l

                   #man 7 signal

                   常用信号:

1)  SIGHUB:无需关闭进程而让其重新读取配置文件

2)  SIGINT:中止正在运行的进程,相当于Ctrl+c

9)  SIGKILL:杀死正在运行的进程

15) SIGTERM:终止正在运行的进程

18) SIGCONT:将停止的进程继续运行

19) SIGSTOP:停止进程

 

                   指定信号的方法:

(1)       信号的数字标识 129

(2)       信号完整名称 SIGHUB

(3)       信号简写名称 HUB

 

进程发送信号格式:

         # kill [ - signal ] pid

终止名称下的所有进程:

         # killall [ - signal ] Program

 

2.10 Linux作业控制

         作业类型通常分为两种:

                   前台作业:通过终端启动,且启动后一直占据终端

                   后台作业:可以通过终端启动,但启动后即转入后台(释放终端);

         让作业运行于后台有两种方法:

(1)       运行中的作业

Ctrl+z

(2)       尚未运行的作业

# COMMAND &

                   此类作业虽然被送往后台但依然与终端相关,如果希望送往后台后,剥离与终端的关系:

                            # nohub COMMAND &

                   查看所有作业:

                            # jobs

                   作业控制:

                            # fg [ % ] [job_num ] :把指定的后台作业调回到前台

                            # bg [ % ] [ job_num]:把送往后台的进程在后台继续运行

                            # kill [ % job_num]:终止指定的作业

 

2.11 进程优先级调整

         Nice命令

                   用途:调整进程静态优先级,静态优先级为100-139,用nice值表示依次对应-20 – 19,进程默认启动时nice值为0,优先级为120

                   格式:nice [ option ] [ command [ ARG ] …]

                   示例:# nice –10 htop   ####-10nice值运行htop进程

 

         Renice命令

                   用途:重置设置进程的nice

                   格式:renice [ -n ] priority pid…

                   示例:# renice -1 33508  ####将进程号33508的进程的nice值变更为-1

 

         查看nice值的方法

                   # ps axo pid,comm,ni

 

本文出自 “学海无涯” 博客,请务必保留此出处http://mwdmwz.blog.51cto.com/814369/1931879

Linux进程管理