Linux 进程及作业管理

==============================================================================

概述:

   我们在实际的运维工作中经常要对服务器做各种监控,以了解其相关状态,比如,CPU利用率,磁盘空间利用率,等等,这就需要我们了解相关的数据并学会使用各种工具来分析数据。本章就将总结Linux系统中进程管理和作业管理的相关命令、参数和工具,包括:进程的相关定义、分类、状态以及进程查看和管理工具,如:pstree、ps、pidof, pgrep, top, htop, glance, pmap, vmstat, dstat, kill ,以及作业管理的相 关内容:job, bg, fg, nice,renice

==============================================================================

第一篇:进程管理



进程的相关概念

 1.相关定义

内核的功用:

  • 进程管理、文件系统、网络功能、内存管理、驱动程序、安全功能等;

进程定义:

  • 通俗的来说进程是运行起来的程序。唯一标识进程的是进程描述符(PID),在linux内核中是通过 task_strucktask_list 来定义和管理进程的 ;

task struct:

  • Linux内核存储进程信息的数据结构格式;

task list:

  • 多个任务的的task struct组成的链表;

进程Process:

 运行中的程序的一个副本,是被载入内存的一个指令集合;

  • 进程ID(Process ID,PID)号码被用来标记各个进程;

  • UID、GID、和SELinux语境决定对文件系统的存取和访问权限;

  • 通常从执行进程的用户来继承;

  • 存在生命周期;

 2.进程创建

init:第一个进程,由内核创建

  • 剩余所有的进程都是有父子关系的

进程:都由其父进程创建,COW(写实复制)

  • fork(), clone() 

创建过程:

  1. 系统首先以fock的方式复制(cow)一个与父进程相同的进程,这个进程与父进程唯一的差别就是PID不同,但是这个进程还会多一个PPID的参数,PPID就是父进程的程序识别码PID;

  2. 然后新产生的进程开始加载实际要运行的程序进行执行。

 3.进程优先级

优先级:

进程的优先级是用数字0-139来表示的,分为两类:

  • 99-1:实时优先级,由内核维护(数字越大,优先级越高)

  • 100-139:静态优先级,使用nice值来调整(数字越小,优先级越高);

Nice值

  • -20,19对应静态优先级100-139

Big o

  • 时间复杂度,用时和规模的关系

  • O(1) :无论复杂度多大,解决问题所消耗的时间是相同的,是最理想的状态。

  • O(logn), O(n)线性,O(n^2)抛物线,O(2^n)

 4.进程内存

进程内存

Page Frame:

  • 页框,用来存储页面数据,存储Page 4k;

LRU:

    Least Recently Used 近期最少使用算法,释放内存;

  • 内存管理的一种页面置换算法,对于在内存中但又不用的数据块(内存块)叫做LRU,操作系统会根据哪些数据属于LRU而将其移出内存而腾出空间来加载另外的数据。

物理地址空间和线性地址空间:

MMU(内存管理单元):负责转换线性和物理地址

  • MMU是Memory Management Unit的缩写,中文名是内存管理单元,它是中央处理器(CPU)中用来管理虚拟存储器、物理存储器的控制线路,同时也负责虚拟地址映射为物理地址以及提供硬件机制的内存访问授权,多用户多进程操作系统。

   5.IPC 进程间通信

IPC:进程间通信 Inter Process Communication 

  • 在计算机网络体系中,主机与主机之间的通信,实质上是主机进程与主机进程之间的通信,也就是进程间的通信;

同一主机上:

  • signal:信号指令;

  • shm:shared memory 共享内存空间;

  • semophore:信号量,一种计数器;

不同主机上:

  • rpc:remote procedure call (远程过程调用)

  • socket:套接字,IP和端口号

 6.Linux内核及进程类型

Linux内核:

  • 抢占式多任务

进程类型:
  根据进程与终端的关系可以分为:

守护进程:

  • daemon,在系统引导过程中启动的进程,和终端无关的进程;

前台进程:

  • 跟终端相关,通过终端启动的进程;

注意:

  • 两者可相互转化

 7.进程状态及进程的分类

进程状态:
进程被内核调度的过程中的状态可以分为:

运行态:running

就绪态:ready

睡眠态:

  • 可中断:interruptable

  • 不可中断:uninterruptable,通常是指被IO阻塞的过程,等待IO满足之前无法继续运行。

停止态:

  • stopped,暂停于内存中,但不会被调度,除非手动启动;

僵死态:

  • zombie,结束进程,父进程结束前,子进程不关闭;

进程的分类:

  • CPU-Bound:CPU密集型,非交互;

  • IO-Bound:IO密集型,交互;

根据在linux不同模式下运行分为:

  • 核心态:这类进程运行在内核模式下,执行一些内核指令(Ring 0)。

  • 用户态这类进程工作在用户模式下,执行用户指令(Ring 3)。

  • 如果用户态的进程要执行一些核心态的指令,此时就会产生系统调用,系统调用会请求内核指令完成相关的请求,就执行的结果返回给用户态进程。

 8.进程与线程的关系:

进程与线程的关系:

  • 进程是程序执行时的一个实例,即它是程序已经执行到课中程度的数据结构的汇集。从内核的观点看,进程的目的就是担当分配系统资源(CPU时间、内存等)的基本单位;

  • 线程是进程的一个执行流,是CPU调度和分派的基本单位,它是比进程更小的能独立运行的基本单位。一个进程由几个线程组成(拥有很多相对独立的执行流的用户程序共享应用程序的大部分数据结构),线程与同属一个进程的其他的线程共享进程所拥有的全部资源;

  • 进程——资源分配的最小单位,线程——程序执行的最小单位

  • 从函数调用上来说,进程创建使用fork()操作;线程创建使用clone()操作

参考资料:

《Linux内核设计与实现》《深入理解Linux内核》

进程的系统管理工具

Linux系统状态的查看及管理工具:

  • pstree, ps, pidof, pgrep, top, htop, glance, pmap, vmstat, dstat, kill   pkill, job, bg, fg, nohup    

不同发行版上的 init 程序:

  • CentOS 5:SysV init

  • CentOS 6:upstart

  • CentOS 7:systemd

 1.pstree命令及/proc 内核中的状态信息;

作用:

  • pstree-display a tree of processes(显示查看进程树

/proc:内核中的状态信息;

 Linux系统各进程的相关信息均保存在/proc/PID目录下的各文件中 

  • Linux 内核提供了一种通过 /proc 文件系统,在运行时访问内核内部数据结构、改变内核设置的机制。proc文件系统是一个伪文件系统,它只存在内存当中,而不占用外存空间。它以文件系统的方式为访问系统内核数据的操作提供接口。

内核参数:

  • 可设置其值从而调整内核运行特性的参数,在/proc/sys/下;

  • 状态变量:其用于输出内核中统计信息或状态信息,仅用于查看;

参数:模拟成文件系统;

进程:/proc/#:(# 为 PID)

Linux 进程及作业管理(一)_top

启动进程的方式:

  • 系统启动过程中自动启动:与终端无关的进程;

  • 用户通过终端启动:与终端相关的进程;

CentOS 6 和 CentOS 7 的区别如下:

# centos 6 进程树如下
[root@CentOS6 ~]# pstree
init─┬─NetworkManager───{NetworkManager}
     ├─abrtd
     ├─acpid
     ├─atd
     ├─auditd───{auditd}
     ├─automount───4*[{automount}]
     ├─console-kit-dae───63*[{console-kit-da}]
     ├─crond
     ├─cupsd
     ├─dbus-daemon
     ├─hald─┬─hald-runner─┬─hald-addon-acpi
     │      │             └─hald-addon-inpu
     │      └─{hald}
     ├─master─┬─pickup
     │        └─qmgr
     ├─6*[mingetty]
     ├─modem-manager
     ├─polkitd
     ├─portreserve
     ├─rpc.statd
     ├─rpcbind
     ├─rsyslogd───3*[{rsyslogd}]
     ├─sshd───sshd───bash───pstree
     ├─udevd───2*[udevd]
     ├─wpa_supplicant
     └─xinetd

 # centos 7
 [root@centos7 ~]# pstree
systemd─┬─NetworkManager─┬─dhclient
        │                └─2*[{NetworkManager}]
        ├─2*[abrt-watch-log]
        ├─abrtd
        ├─agetty
        ├─alsactl
        ├─atd
        ├─auditd─┬─audispd─┬─sedispatch
        │        │         └─{audispd}
        │        └─{auditd}
        ├─automount───4*[{automount}]
        ├─chronyd
        ├─crond
        ├─cupsd
        ├─dbus-daemon
        ├─gssproxy───5*[{gssproxy}]
        ├─lsmd
        ├─lvmetad
        ├─master─┬─pickup
        │        └─qmgr
        ├─polkitd───5*[{polkitd}]
        ├─rsyslogd───2*[{rsyslogd}]
        ├─smartd
        ├─sshd───sshd───bash───pstree
        ├─systemd-journal
        ├─systemd-logind
        ├─systemd-udevd
        ├─tuned───4*[{tuned}]
        └─wpa_supplicant

 2.ps:显示系统当前进程的运行情况

ps:查看进程信息

语法:

  • ps [OPTION]...

支持三种选项:

  • UNIX选项:如 -a

  • BSD选项:如 a

  • GUN选项:如 --help

选项和参数

 默认显示当前终端中的进程;

  • a:所有与终端相关的进程;

  • x:所有与终端无关的进程;

  • u:显示进程所有者的信息;

  • f:显示进程的父进程;

  • o:属性… 选项显示定制的信息:

常见组合

aux

Linux 进程及作业管理(一)_top_02


首行代表的含义如下:

Linux 进程及作业管理(一)_ps_03

- ef

  • -e:显示所有进程

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

Linux 进程及作业管理(一)_linux_04


首行代表的含义如下:

Linux 进程及作业管理(一)_linux_05


-eFH

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

         C:cpu utillization(cpu使用率)

         PSR:运行于哪颗cpu之上

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

Linux 进程及作业管理(一)_top_06

-eo axo

  • o field1,field2...:自定义要显示的字段,以逗号分隔

  • 常用的字段:pid,ni,pri,pcpu,stat,comm,tty,ppid

     ni:nice值

     priority:优先级

     psr:processor, CPU编号

     rtprio:实时优先级

Linux 进程及作业管理(一)_top_07

演示:

[root@CentOS6 ~]# ps
   PID TTY          TIME CMD
  3614 pts/1    00:00:00 bash
  5905 pts/1    00:00:00 ps
[root@CentOS6 ~]# ps a
   PID TTY      STAT   TIME COMMAND
  1921 tty1     Ss+    0:00 /sbin/mingetty /dev/tty1
  1923 tty2     Ss+    0:00 /sbin/mingetty /dev/tty2
  1925 tty3     Ss+    0:00 /sbin/mingetty /dev/tty3
  1927 tty4     Ss+    0:00 /sbin/mingetty /dev/tty4
  1929 tty5     Ss+    0:00 /sbin/mingetty /dev/tty5
  1931 tty6     Ss+    0:00 /sbin/mingetty /dev/tty6
  3614 pts/1    Ss     0:00 -bash
  5907 pts/1    R+     0:00 ps a

 3.搜索进程

ps 选项| grep (最灵活的方式)

pgrep,pkill 

  • 按预定义的模式检索,显示指定的进程信息;

语法:pgrep [options] patter

选项:

  • -u uid:effective user,生效者

  • -U user:real user,显示以指定用户身份运行的进程;

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

  • -l:显示pid和进程名;

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

  • -P pid:显示此进程的子进程;

  • 直接按模式搜索:

pidof 命令

  • 根据进程名取其pid

  • 语法:pidof PROGRAM (给定命令行程序)

演示:

 1.使用grep 过滤

[root@CentOS6 ~]# ps aux |grep postfix
root       1844  0.0  0.3  80896  3440 ?        Ss   09:08   0:00 /usr/libexec/postfix/master
postfix    1855  0.0  0.3  81144  3440 ?        S    09:08   0:00 qmgr -l -t fifo -u
postfix    5952  0.0  0.3  80976  3404 ?        S    22:28   0:00 pickup -l -t fifo -u
root       5992  0.0  0.0 103320   844 pts/1    S+   22:46   0:00 grep postfix

 2.pgrep使用

[root@CentOS6 ~]# pgrep -U postfix
1855
5952

[root@centos7 ~]# pgrep -U postfix -l
1180 qmgr
2896 pickup

[root@centos7 ~]# pgrep -U postfix -a
1180 qmgr -l -t unix -u
2896 pickup -l -t unix -u

[root@centos7 ~]# ps -eFH |grep sshd
root       2236   1088  0 36394  5572   0 14:34 ?        00:00:02     sshd: root@pts/1
[root@centos7 ~]# pgrep -P 1088
2236

[root@centos7 ~]# pgrep ssh  #按ssh 开头的的进程搜索
1088
2236
[root@centos7 ~]# pgrep ss
821
1088
2236

3.pidof 命令

[root@centos7 ~]# pidof sshd
2236 1088

 



由于篇幅限制,后续内容详见http://1992tao.blog.51cto.com/11606804/1901943 进程及作业管理(二)