进程和计划任务管理

170 阅读14分钟

程序

什么是程序?

  • 是一组计算机能识别和执行的指令,运行于电子计算机上,满足人们某种需求的信息化工具。
  • 用于描述进程要完成的功能,是控制进程执行的指令集。
  • 保存在硬盘、光盘等介质中的可执行代码和数据。
  • 静态保存的代码。

进程

什么是进程

运行中的程序的一个副本,是被载入内存的一个指令集合,是资源分配的单位。

  • 在CPU及内存中运行的程序代码
  • 动态执行的代码
  • 进程ID(Process ID,PID)号码被用来标记各个进程
  • UID、GID、和SELinux语境决定对文件系统的存取和访问权限
  • 通常从执行进程的用户来继承
  • 存在生命周期
  • 都由其父进程创建

进程是已启动的可执行程序的运行实例,进程有以下组成部分

  • 已分配内存的地址空间;
  • 安全属性,包括所有权凭据和特权;
  • 有权限限制;
  • 程序代码的一个或多个执行线程;

父进程与子进程

父进程复制自己的地址空间(fork派生)创建一个新的(子)进程结构。
每个进程分配一个唯一的进程ID(PID),满足跟踪安全性之需。
任何进程都可以创建子进程。
所有进程都是第一个系统进程的后代。

进程具有的特征

  • 动态性:进程是程序的一次执行过程,是临时的,有生命期的,是动态产生,动态消亡的;
  • 并发性:任何进程都可以同其他进程一起并发执行;
  • 独立性:进程是系统进行资源分配和调度的一个独立单位;
  • 结构性:进程由程序、数据和进程控制块三部分组成。

僵尸进程

一个进程结束了,但是如果该进程的父母进程已经先结束了,那么该进程就不会变成僵尸进程,因为每个进程结束的时候,系统都会扫描当前系统中所运行的所有进程,系统都会扫描当前系统中所运行的所有进程,看有没有哪个进程是刚刚结束的这个进程的子进程,如果是的话,就由init来接管它,成为它的父进程,子进程退出后init会回收其占用的相关资源。但是当子进程比父进程先结束,而父进程又没有回收子进程,释放子进程占用的资源,此时子进程将成为一个僵尸进程。

查看进程

ps命令 ---查看静态的进程统计信息

常用选项

  • a:显示当前终端下的所有进程信息,包括其他用户的进程。与“x”选项结合时将示系统中所有的进程信息。
  • u:使用以用户为主的格式输出进程信息。
  • x:显示当前用户在所有终端下的进程信息。
  • -e:显示系统内的所有进程信息。
  • -l:使用长(Long)格式显示进程信息。
  • -f:使用完整的(Full)格式显示进程信
  • -T:查看线程信息

ps aux

使用“ps aux”命令查看进程信息:

[root@localhost ~]# ps aux
USER        PID %CPU %MEM    VSZ   RSS TTY      STAT START   TIME COMMAND
root          1  0.0  0.3 193832  7068 ?        Ss   10:42   0:01 /us
root          2  0.0  0.0      0     0 ?        S    10:42   0:00 [kt
root          3  0.0  0.0      0     0 ?        S    10:42   0:00 [ks
root          5  0.0  0.0      0     0 ?        S<   10:42   0:00 [kw
root          6  0.0  0.0      0     0 ?        S    10:42   0:00 [kw

image.png

各列的解释

表头(列名)含义
USER该进程是由哪个用户产生的。
PID进程的 ID。
%CPU该进程占用 CPU 资源的百分比,占用的百分比越高,进程越耗费资源。
%MEM该进程占用物理内存的百分比,占用的百分比越高,进程越耗费资源。
VSZ该进程占用虚拟内存的大小,单位为 KB。
RSS该进程占用实际物理内存的大小,单位为 KB。
TTY该进程是在哪个终端运行的。 其中,tty1 ~ tty7 代表本地控制台终端(可以通过 Alt+F1 ~ F7 快捷键切换不同的终端),tty1~tty6 是本地的字符界面终端,tty7 是图形终端。 pts/0 ~ 255 代表虚拟终端,一般是远程连接的终端,第一个远程连接占用 pts/0,第二个远程连接占用 pts/1,依次増长。
STAT进程状态。常见的状态有以下几种: -D:不可被唤醒的睡眠状态,通常用于 I/O 情况。 -R:该进程正在运行。 -S:该进程处于睡眠状态,可被唤醒。 -T:停止状态,可能是在后台暂停或进程处于除错状态。 -W:内存交互状态(从 2.6 内核开始无效)。 -X:死掉的进程(应该不会出现)。 -Z:僵尸进程。进程已经中止,但是还是占用硬件资源。 -<:高优先级(以下状态在 BSD 格式中出现)。 -N:低优先级。 -L:被锁入内存。 -s:包含子进程。 -l:多线程(小写 L)。 -+:进程位于后台。
START该进程的启动时间。
TIME该进程占用 CPU 的运算时间,注意不是系统时间。
COMMAND产生此进程的命令名。

ps -elf

使用“ps -elf”命令查看进程信息

[root@localhost ~]# ps -elf
F S UID         PID   PPID  C PRI  NI ADDR SZ WCHAN  STIME TTY          TIME CMD
4 S root          1      0  0  80   0 - 48458 ep_pol 10:42 ?        00:00:01 /usr/lib/systemd/systemd --switch
1 S root          2      0  0  80   0 -     0 kthrea 10:42 ?        00:00:00 [kthreadd]
1 S root          3      2  0  80   0 -     0 smpboo 10:42 ?        00:00:00 [ksoftirqd/0]
1 S root          5      2  0  60 -20 -     0 worker 10:42 ?        00:00:00 [kworker/0:0H]
1 S root          6      2  0  80   0 -     0 worker 10:42 ?        00:00:00 [kworker/u256:0]

image.png

各列的解释

表头(列名)含义
F进程标志,说明进程的权限,常见的标志有两个: 1:进程可以被复制,但是不能被执行; 4:进程使用超级用户权限;
S进程状态。具体的状态和"psaux"命令中的 STAT 状态一致;
UID运行此进程的用户的 ID;
PID进程的 ID;
PPID父进程的 ID;
C该进程的 CPU 使用率,单位是百分比;
PRI进程的优先级,数值越小,该进程的优先级越高,越早被 CPU 执行;系统定义不可以人为修改
NI进程的优先级,数值越小,该进程越早被执行;可以人为修改
ADDR该进程在内存的哪个位置;
SZ该进程占用多大内存;
WCHAN该进程是否运行。"-"代表正在运行;
TTY该进程由哪个终端产生;
TIME该进程占用 CPU 的运算时间,注意不是系统时间;
CMD产生此进程的命令名;

top命令——动态查看进程

op 命令可以动态地持续监听进程地运行状态,与此同时,该命令还提供了一个交互界面,用户可以根据需要,人性化地定制自己的输出,进而更清楚地了进程的运行状态。

选项

选项作用
-d 秒数指定 top 命令每隔几秒更新。默认是 3 秒
-b使用批次处理模式输出。一般和"-n"选项合用,用于把 top 命令重定向到文件中
-n 次数指定 top 命令执行的次数。一般和"-"选项合用
-p 进程PID仅查看指定 ID 的进程
-s使 top 命令在安全模式中运行,避免在交互模式中出现错误
-u 用户名只监听某个用户的进程

常用命令

命令作用
p根据cpu使用百分比大小进行排序
M按照内存(memory)的使用率排序
N按照 PID 排序
c按照 CPU 的使用率排序,默认就是此选项
h可以获得 top程序的在线帮助信息
k按照 PID 给予某个进程一个信号。一般用于中止某个进程,信号 9 是强制中止的信号
q退出 top 命令
数字1显示cpu个数和状态
top -H:显示所有线程
top -H-p <pid>:显示特定进程中的线程   

top命令输出内容

top 命令的输出内容是动态的,默认每隔 3 秒刷新一次。

命令的输出主要分为两部分:

  • 第一部分是前五行,显示的是整个系统的资源使用状况,我们就是通过这些输出来判断服务器的资源使用状态的。
  • 第二部分从第六行开始,显示的是系统中进程的信息。

top命令输出内容——第一部分详解

第一部分是前五行,显示的是整个系统的资源使用状况。

 top - 15:42:37 up 35 min,  2 users,  load average: 0.28, 0.37, 0.30
 Tasks: 169 total,   1 running, 168 sleeping,   0 stopped,   0 zombie
 %Cpu(s):  6.0 us,  9.4 sy,  0.0 ni, 84.6 id,  0.0 wa,  0.0 hi,  0.0 si,  0.0 st
 KiB Mem :  1867024 total,  1243576 free,   255592 used,   367856 buff/cache
 KiB Swap:  4194300 total,  4194300 free,        0 used.  1423048 avail Mem 
  • 第一行是任务队列信息
  • 第二行是进程信息
  • 第三行是 CPU 信息
  • 第四行是物理内存信息
  • 第五行是交换分区(swap)信息

top命令输出内容——第二部分详解

top 命令的第二部分输出,主要是系统进程信息,各个字段的含义如下:

表头(字段名)说明
PID进程的 ID号
USER该进程所属的用户
PRpriority优先级,数值越小 优先级越高
NInice优先级,数值越小 优先级越高
VIRT该进程使用的虚拟内存的大小,单位为 KB
RES该进程使用的物理内存的大小,单位为 KB
SHR共享内存大小,单位为 KB
S进程状态
%CPU该进程占用 CPU 的百分比
%MEM该进程占用内存的百分比
TIME+该进程总共占用的 CPU 时间
COMMAND进程的命令名(进程文件、进程名称)

pgrep命令——查询进程的PID

选项

  • -U:指定用户

  • -l:显示进程名

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

  • -P < PID>:显示指定进程的子进程

[root@localhost ~]# pgrep -U root -l     //查询nancy用户的进程PID,并显示进程名
1 systemd
2 kthreadd
3 ksoftirqd/0

    
[root@localhost ~]# pgrep "log" -l     ////查询进程名称中带有"log"的进程的PID,并显示进程名称
465 xfs-log/dm-0
707 xfs-log/sda1
728 xfs-log/dm-2
801 systemd-logind
803 abrt-watch-log
806 abrt-watch-log
814 rsyslogd

[root@localhost ~]# pgrep -P 823     //查询PID为823的进程的子进程  
  846

prtstat命令——查看指定的进程

命令格式

 prtstat [options] PID

常用选项

-r :格式显示(raw)

[root@localhost ~]# prtstat 825
Process: accounts-daemon		State: S (sleeping)
  CPU#:  2  		TTY: 0:0	Threads: 3
Process, Group and Session IDs
  Process ID: 825		  Parent ID: 1
    Group ID: 825		 Session ID: 825
  T Group ID: -1

Page Faults
  This Process    (minor major):     1751         9
  Child Processes (minor major):        0         0
CPU Times
  This Process    (user system guest blkio):   0.03   0.07   0.00   0.00
  Child processes (user system guest):         0.00   0.00   0.00
Memory
  Vsize:       401 MB    
  RSS:         4296 kB    		 RSS Limit: 18446744073709 MB
  Code Start:  0x56554aac7000		 Code Stop:  0x56554aaea89c
  Stack Start: 0x7ffc83da0670
  Stack Pointer (ESP): 0x7ffc83da04c0	 Inst Pointer (EIP): 0x7fee3737aa3d
Scheduling
  Policy: normal
  Nice:   0 		 RT Priority: 0 (non RT)

image.png

    [root@localhost ~]# prtstat -r 825
         pid: 825            	                  comm: accounts-daemon
       state: S              	                  ppid: 1
        pgrp: 825            	               session: 825
      tty_nr: 0              	                 tpgid: -1
       flags: 40402100       	                minflt: 1751
     cminflt: 0              	                majflt: 9
     cmajflt: 0              	                 utime: 3
       stime: 7              	                cutime: 0
      cstime: 0              	              priority: 20
        nice: 0              	           num_threads: 3
 itrealvalue: 0              	             starttime: 556
       vsize: 401608704      	                   rss: 1049
      rsslim: 18446744073709551615	             startcode: 94924325023744
     endcode: 94924325169308 	            startstack: 140722520589936
     kstkesp: 7FFC83DA04C0   	               kstkeip: 7FEE3737AA3D
       wchan: 18446744073709551615	                 nswap: 0
      cnswap: 18446744073709551615	           exit_signal: 17
   processor: 2              	           rt_priority: 0
      policy: 0              	 delayaccr_blkio_ticks: 0
  guest_time: 0              	           cguest_time: 0

image.png

pstree命令——以树形结构列出进程信息

格式

 pstree  [OPTION]  [ PID | USER ]    

选项

选项作用
-a显示启动每个进程对应的完整指令,包括启动进程的路径、参数等
-p显示PID
-p < pid>显示指定进程及其子进程,同时显示每个进程的PID
-u显示进程的用户名称
-H < pid>高亮显示指定进程及其前辈进程
-T不显示线程thread,默认显示线程

示例

pstree PID,显示指定进程及其子进程

[root@localhost ~]# pstree 1
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}]

pstree -p PID,显示指定进程及其子进程,同时显示PID

[root@localhost ~]# pstree -p 2261
tracker-store(2261)─┬─{tracker-store}(2265)
                    ├─{tracker-store}(2277)
                    ├─{tracker-store}(2278)
                    ├─{tracker-store}(2281)
                    ├─{tracker-store}(2282)
                    ├─{tracker-store}(2283)
                    └─{tracker-store}(2284)
    

pstree -u 用户名,显示指定用户的进程

 [root@localhost ~]# pstree -u root -p
systemd(1)─┬─ModemManager(815)─┬─{ModemManager}(838)
           │                   └─{ModemManager}(845)
           ├─NetworkManager(891)─┬─{NetworkManager}(899)
           │                     └─{NetworkManager}(903)
           ├─VGAuthService(798)
           ├─abrt-watch-log(803)
           ├─abrt-watch-log(806)
           ├─abrtd(802)
           ├─accounts-daemon(825)─┬─{accounts-daemon}(832)
           │                      └─{accounts-daemon}(853)
   

-a,显示启动进程的完整指令,包括启动进程的路径、参数等

[root@localhost ~]# pstree 2261 -a
tracker-store
  └─7*[{tracker-store}]
    

-aup,同时显示启动进程的完整指令、进程的所属用户、进程PID

[root@localhost ~]# pstree -aup
systemd,1 --switched-root --system --deserialize 21
  ├─ModemManager,815
  │   ├─{ModemManager},838
  │   └─{ModemManager},845
  ├─NetworkManager,891 --no-daemon
  │   ├─{NetworkManager},899
  │   └─{NetworkManager},903
  ├─VGAuthService,798 -s
  ├─abrt-watch-log,803 -F BUG: WARNING: at WARNING: CPU:INFO: possib
  ├─abrt-watch-log,806 -F Backtrace /var/log/Xorg.0.log --/usr/bin/a
  ├─abrtd,802 -d -s
    

lsof命令——列举被打开的文件

格式

 lsof  [options] 

常用选项

选项功能
-c 字符串只列出以字符串开头的进程打开的文件。
+d 目录名列出某个目录中所有被进程调用的文件。
-u 用户名只列出某个用户的进程打开的文件。
-p pid列出某个 PID 进程打开的文件。

示例

[root@localhost ~]# lsof | more     //查询系统中所有进程调用的文件  

[root@localhost ~]# lsof +d /dev |more   //显示/dev目录下所有被打开的文件及对应进程 

[root@localhost ~]# lsof -u nancy   //查询nancy用户打开的所有文件

[root@localhost ~]# lsof -p 2261      //查询655进程打开的所有文件
COMMAND    PID USER   FD      TYPE             DEVICE  SIZE/OFF      NODE NAME
tracker-s 2261 root  cwd       DIR              253,0       224        64 /
tracker-s 2261 root  rtd       DIR              253,0       224        64 /
tracker-s 2261 root  txt       REG              253,0    142928  34995294 /usr/libexec/tracker-store
tracker-s 2261 root  mem       REG              253,0     44448  33604117 /usr/lib64/librt-2.17.so
tracker-s 2261 root  mem       REG              253,0     14872  33604

[root@localhost ~]# lsof /bin/bash    //查询打开/bin/bash文件的所有进程
COMMAND   PID USER  FD   TYPE DEVICE SIZE/OFF NODE NAME
ksmtuned  868 root txt    REG  253,0   960472 7058 /usr/bin/bash
bash     2656 root txt    REG  253,0   960472 7058 /usr/bin/bash
bash     3113 root txt    REG  253,0   960472 7058 /usr/bin/bash

image.png image.png

vmstat命令——监控系统资源

格式一

 vmstat [-a] [刷新延时 刷新次数]
 
 #-a:显示活跃和非活跃内存

示例

[root@localhost ~]# vmstat 3 2
procs -----------memory---------- ---swap-- -----io---- -system-- ------cpu-----
 r  b   swpd   free   buff  cache   si   so    bi    bo   in   cs us sy id wa st
 1  0      0 471364   2156 582072    0    0     3     0   13   12  0  0 100  0  0
 0  0      0 471224   2156 582072    0    0     0     0   84   73  0  0 100  0  0

image.png 字段含义

字段含义
procs进程信息字段: -r:等待运行的进程数,数量越大,系统越繁忙。 -b:不可被唤醒的进程数量,数量越大,系统越繁忙。
memory内存信息字段: -swpd:虚拟内存的使用情况,单位为 KB。 -free:空闲的内存容量,单位为 KB。 -buff:缓冲的内存容量,单位为 KB。 -cache:缓存的内存容量,单位为 KB。
swap交换分区信息字段: -si:从磁盘中交换到内存中数据的数量,单位为 KB。 -so:从内存中交换到磁盘中数据的数量,单位为 KB。 这两个数越大,表明数据需要经常在磁盘和内存之间进行交换,系统性能越差。
io磁盘读/写信息字段: -bi:从块设备中读入的数据的总量,单位是块。 -bo:写到块设备的数据的总量,单位是块。这两个数越大,代表系统的 I/O 越繁忙。
system系统信息字段: -in:每秒被中断的进程次数。 -cs:每秒进行的事件切换次数。 这两个数越大,代表系统与接口设备的通信越繁忙。
cpuCPU信息字段: -us:非内核进程消耗 CPU 运算时间的百分比。 -sy:内核进程消耗 CPU 运算时间的百分比。 -id:空闲 CPU 的百分比。 -wa:等待 I/O 所消耗的 CPU 百分比。 -st:被虚拟机所盗用的 CPU 百分比

格式二

 vmstat  [选项]... 

选项:

选项含义
-f显示从启动到目前为止,系统复制(fork)的程序数。此信息是从 /proc/stat 中的 processes 字段中取得的。
-s将从启动到目前为止,由一些事件导致的内存变化情况列表说明。这些信息的分别来自于/proc/meminfo,/proc/stat和/proc/vmstat。
-S 单位令输出的数据显示单位,例如用 K/M 取代 bytes 的容量。
-d列出硬盘有关读写总量的统计表。
-p 分区设备文件名查看硬盘分区的读写情况。

示例

-f,显示从启动到目前为止,系统共fork(派生)的程序数。

[root@localhost ~]# vmstat -f
         7144 forks

-S 单位,令输出的数据按指定单位显示。k/K,以KB为单位;m/M,以MB为单位

[root@localhost ~]# vmstat -S k           //令输出的内容以KB为单位
procs -----------memory---------- ---swap-- -----io---- -system-- ------cpu-----
 r  b   swpd   free   buff  cache   si   so    bi    bo   in   cs us sy id wa st
 1  0      0 482615   2207 595976    0    0     3     0   13   12  0  0 100  0  0
[root@localhost ~]# vmstat -S m           //令输出的内容以MB为单位
procs -----------memory---------- ---swap-- -----io---- -system-- ------cpu-----
 r  b   swpd   free   buff  cache   si   so    bi    bo   in   cs us sy id wa st
 1  0      0    482      2    595    0    0     3     0   13   12  0  0 100  0  0

image.png -d,列出硬盘有关读写总量的统计表

[root@localhost ~]# vmstat -d
disk- ------------reads------------ ------------writes----------- -----IO------
       total merged sectors      ms  total merged sectors      ms    cur    sec
sdb      320      0   17292      23      0      0       0       0      0      0
sda    14135     16 1021910    3828   2363    176   53107     830      0      2
sr0       29      0    2100      23      0      0       0       0      0      0
dm-0   11856      0  948955    3657   2531      0   44915     933      0      2
dm-1      94      0    4456       3      0      0       0       0      0      0
dm-2     178      0    3999      14      4      0    4096       4      0      0

image.png -s,显示内存相关统计信息及多种系统活动数量

[root@localhost ~]# vmstat -s
      1867048 K total memory
       811452 K used memory
       743824 K active memory
       360724 K inactive memory
       471388 K free memory
         2156 K buffer memory
       582052 K swap cache
      2097148 K total swap
            0 K used swap
      2097148 K free swap
         1245 non-nice user cpu ticks
            8 nice user cpu ticks
         3752 system cpu ticks
     20274118 idle cpu ticks
          183 IO-wait cpu ticks
            0 IRQ cpu ticks
           84 softirq cpu ticks
            0 stolen cpu ticks
       520651 pages paged in
        26600 pages paged out
            0 pages swapped in
            0 pages swapped out
      2540589 interrupts
      2354154 CPU context switches
   1660185747 boot time
         7204 forks

-p 分区设备文件名,查看硬盘分区的读写情况

[root@localhost ~]# vmstat -p /dev/sdb1
sdb1          reads   read sectors  writes    requested writes
                  70       4320          0          0

image.png