查看和控制进程

程序与进程的关系

  • 程序

    • 保存在硬盘、光盘等介质中的可执行代码和数据
    • 静态保存的代码
  • 进程
    • CPU及内存中运行的程序代码
    • 动态执行的代码
    • 父、子进程
    • 每个进程可以创建一个或多个进程

简单的说,程序是指电脑可以识别运行的指令集合。进程是一个正在执行的程序。进程是程序的一部分,程序运行的时候会产生进程。

查看进程

了解系统中进程的状态是对进程进行管理的前提,使用不同的命令工具可以从不同的 角度查看进程状态。

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

    • 命令格式

    ps [选项]

    • 常用选项

    a:显示当前终端下的所有进程信息,包括其他用户的进程。

    u:使用以用户为主的格式输出进程信息。

    x:显示当前用户在所有终端下的进程信息。

    -e:显示系统内的所有进程信息。

    -l:使用长格式显示进程信息。

    -f:使用完整的格式显示进程信息。

[root@localhost ~]# ps aux
USER        PID %CPU %MEM    VSZ   RSS TTY      STAT START   TIME COMMAND
root          1  0.0  0.3 193700  6500 ?        Ss   14:05   0:06 /usr/lib/systemd/system
root          2  0.0  0.0      0     0 ?        S    14:05   0:00 [kthreadd]
root          3  0.0  0.0      0     0 ?        S    14:05   0:00 [ksoftirqd/0]
root          5  0.0  0.0      0     0 ?        S<   14:05   0:00 [kworker/0:0H]
root          7  0.0  0.0      0     0 ?        S    14:05   0:00 [migration/0]
root          8  0.0  0.0      0     0 ?        S    14:05   0:00 [rcu_bh]
root          9  0.0  0.0      0     0 ?        S    14:05   0:02 [rcu_sched]
root         10  0.0  0.0      0     0 ?        S    14:05   0:00 [watchdog/0]
...//省略部分内容...

在上面的输出信息中,第一行为列表标题,其各字段含义如下:

USER:启动该进程的用户账号的名称。

PID:该进程在系统中的数字 ID 号,在当前系统中是唯一的。

%CPU:CPU 占用的百分比。

%MEM:内存占用的百分比。

VSZ:占用虚拟内存(swap 空间)的大小。

RSS:占用常驻内存(物理内存)的大小。

TTY:表明该进程在哪个终端上运行。“?”表示未知或不需要终端。

STAT:显示进程当前的状态,如 S(休眠)、R(运行)、Z(僵死)、<(高优先级)、 N(低优先级)、s(父进程)、+(前台进程)。

START:启动该进程的时间。

TIME:该进程占用的 CPU 时间。

COMMAND:启动该进程的命令的名称。

[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 - 48425 ep_pol 14:05 ?        00:00:06 /usr/lib/systemd/systemd --switche
1 S root          2      0  0  80   0 -     0 kthrea 14:05 ?        00:00:00 [kthreadd]
1 S root          3      2  0  80   0 -     0 smpboo 14:05 ?        00:00:00 [ksoftirqd/0]
1 S root          5      2  0  60 -20 -     0 worker 14:05 ?        00:00:00 [kworker/0:0H]
1 S root          7      2  0 -40   - -     0 smpboo 14:05 ?        00:00:00 [migration/0]
1 S root          8      2  0  80   0 -     0 rcu_gp 14:05 ?        00:00:00 [rcu_bh]
1 S root          9      2  0  80   0 -     0 rcu_gp 14:05 ?        00:00:02 [rcu_sched]
5 S root         10      2  0 -40   - -     0 smpboo 14:05 ?        00:00:00 [watchdog/0]
5 S root         11      2  0 -40   - -     0 smpboo 14:05 ?        00:00:01 [watchdog/1]
...//省略部分内容...

在上面的输出信息中,我们可以看出两个输出结果相比较来说ps -elf输出的内容更为全面,其列表字段也有些不同,含义如下:

UID:与上面的USER含义相同。

PPID:当前进程的父进程。

C :cpu的占用 。

PRI :优先级(用户态的优先级)。

NI :内核优先级(-20~19) 数值越低优先级越高。

ADDR :运行状态 (-表示正在运行)。

SZ : 表示占用swap交换分区容量。

WCHAN:当前进程内核态的名称

直接执行不带任何选项的 ps 命令时,将只显示当前用户会话中打开的进程:

[root@localhost ~]# ps
   PID TTY          TIME CMD
  1624 pts/0    00:00:00 bash
 12076 pts/0    00:00:00 ps
  • top命令——查看进程动态信息

    使用 ps 命令查看到的是一个静态的进程信息,并不能连续地反馈出当前进程的运行状态。若希望以动态刷新的方式显示各进程的状态信息,可以使用 top命令。top命令将会在当前终端以全屏交互式的界面显示进程排名,及时跟踪包括CPU、内存等系统资源占用情况,默认情况下每三秒钟刷新一次,其作用基本类似于Windows操作系统中的任务管理器。

Tasks: 145 total,   1 running, 144 sleeping,   0 stopped,   0 zombie
%Cpu(s):  0.0 us,  0.2 sy,  0.0 ni, 99.8 id,  0.0 wa,  0.0 hi,  0.0 si,  0.0 st
KiB Mem :  1867048 total,   478488 free,   339336 used,  1049224 buff/cache
KiB Swap:  4194300 total,  4193864 free,      436 used.  1294208 avail Mem 

   PID USER      PR  NI    VIRT    RES    SHR S  %CPU %MEM     TIME+ COMMAND             
   615 root      20   0  305296   6204   4820 S   0.3  0.3   0:13.89 vmtoolsd             
     1 root      20   0  193700   6500   3688 S   0.0  0.3   0:07.02 systemd             
     2 root      20   0       0      0      0 S   0.0  0.0   0:00.02 kthreadd             
     3 root      20   0       0      0      0 S   0.0  0.0   0:00.31 ksoftirqd/0        
     5 root       0 -20       0      0      0 S   0.0  0.0   0:00.00 kworker/0:0H         
     7 root      rt   0       0      0      0 S   0.0  0.0   0:00.11 migration/0         
     8 root      20   0       0      0      0 S   0.0  0.0   0:00.00 rcu_bh              
     9 root      20   0       0      0      0 S   0.0  0.0   0:02.43 rcu_sched           
    10 root      rt   0       0      0      0 S   0.0  0.0   0:00.12 watchdog/0       

上述输出信息中,开头的部分显示了系统任务(Tasks)CPU占用、内存占用(Mem)、交换空间(Swap)等汇总信息,相关信息的含义表述如下:

Tasks系统任务信息:total:总进程数;running:正在运行的进程数;sleeping:休眠的进程数;stopped:中止的进程数;zombie:僵死无响应的进程数

CPU占用信息:us:用户占用;sy:内核占用;ni:优先级调度占用;id:空闲 CPUwaI/O 等待占用;hi:硬件中断占用;si:软件中断占用;st:虚拟化占用

Mem内存占用信息:total:总内存空间;free:空闲内存;used:已用内存;buff/cache:物理内存和交换内存的缓冲区总和

Swap交换空间占用:total:总交换空间;free:空闲交换空间;used:已用交换空间;avail Mem:可用物理空间。

在top命令模式下还可以通过"c键"会根据CPU占用情况来排序列表;"m键"会根据内存占用情况来排序;“q键“退出模式

  • pgrep 命令——查询进程信息

    通过pgrep命令,可以只指定进程的一部分名称进行查询

    • 常用格式

    -l: [进程名称]

    -U [用户名称]

    -t [终端]

[root@localhost ~]# pgrep -l "log"
291 xfs-log/sda2
[root@localhost ~]# pgrep -l -U root -t tty1
10050 X
  • pstree 命令——查看进程树

    pstree 命令可以输出Linux操作系统中各进程的树形结构,以更加直观地判断各进程之间的相互关系(父进程、子进程)。

    • 常用格式

    -a:显示完整信息

    -u:列处对应用户名

    -p:列出对应PID号

[root@localhost ~]# pstree -aup
systemd,1 --switched-root --system --deserialize 21
  ├─ModemManager,575
  │   ├─{ModemManager},591
  │   └─{ModemManager},601
  ├─NetworkManager,669 --no-daemon
  │   ├─dhclient,793 -d -q -sf /usr/libexec/nm-dhcp-helper -pf /var/run/dhclient-ens33.pid -lf...
  │   ├─{NetworkManager},681
  │   └─{NetworkManager},685
  ├─VGAuthService,567 -s
  ├─abrt-watch-log,577 -F Backtrace /var/log/Xorg.0.log -- /usr/bin/abrt-dump-xorg -xD
  ├─abrt-watch-log,618 -F BUG: WARNING: at WARNING: CPU: INFO: possible recursive locking detectedernel BU
  ├─abrtd,569 -d -s
...//省略部分内容...

也可以只查看属于指定用户的进程树结构,只要指定用户名作为参数即可。

[root@localhost ~]# pstree -ap sun
at-spi-bus-laun,12820
  ├─dbus-daemon,12825 --config-file=/usr/share/defaults/at-spi2/accessibility.conf --nofork ...
  │   └─{dbus-daemon},12826
  ├─{at-spi-bus-laun},12821
  ├─{at-spi-bus-laun},12822
  └─{at-spi-bus-laun},12824

at-spi2-registr,12828 --use-gnome-session
  ├─{at-spi2-registr},12831
  └─{at-spi2-registr},12832
...//省略部分内容...

控制进程

1、启动进程

Linux操作系统中,可以由用户手工启动或者按预订计划调度启动新的进程

  • 手工启动进程
    • 前台启动:用户输入命令,直接执行程序
    • 后台启动:在命令行尾加入“&”符号
[root@localhost ~]# cp /opt/data/Packages/ /mnt/ & //将Packages目录复制到mnt目录,并在后台运行
[1] 15054                    //显示后台运行文件任务序号、PID号            
  • 调度启动

    使用at命令,设置一次性计划任务

    使用crontab命令,设置周期性计划任务

2、改变进程的运行方式

  • Ctrl+Z组合键挂起当前的进程

    当 Linux 操作系统中的命令正在前台执行时,按Ctrl+Z 组合键可以将当前命令调入后台并停止执行。

[root@localhost ~]# cp -r /opt/data/Packages/ /mnt    //执行命令将Packages文件复制到mnt目录
^Z                                        //按Ctrl+Z 组合键将任务调到后台运行,并停止任务
[1]+  已停止               cp -i -r /opt/data/Packages/ /mnt  //任务调到后台并停止
[root@localhost ~]# 
  • jobs命令——查看后台的进程

    需要查看当前终端中在后台运行的进程任务时,可以使用 jobs 命令,结合“-l”选项可以同时显示该进程对应的 PID号。

[root@localhost ~]# jobs -l   //查看后台运行的进程
[1]+ 15254 停止                  cp -i -r /opt/data/Packages/ /mnt   //显示后台信息
  • fg命令——将后台的进程恢复运行

    使用 fg命令可以将后台任务重新恢复到前台运行。除非后台中的任务只有一个,fg 命令需要指定后台进程的任务编号作为参数。

[root@localhost ~]# fg 1                //将后台任务调制前台运行
cp -i -r /opt/data/Packages/ /mnt      //任务返回前台继续运行
  • bg命令——将后台中暂停执行任务在后台恢复执行

    使用bg命令,可以将后台中暂停执行(如按Ctrl+Z 组合键挂起)的任务恢复运行,继续在后台执行操作,除非后台中的任务只有一个,否则 bg命令需要指定后台进程的任务编号作为参数。

[root@localhost ~]# jobs -l              //查看后台运行进程
[1]+ 15254 停止                  cp -i -r /opt/data/Packages/ /mnt
[root@localhost ~]# bg 1                //启动在后台暂停的程序,并在后台执行
[1]+ cp -i -r /opt/data/Packages/ /mnt &   //开始执行任务
[root@localhost ~]# jobs -l        //查看后台运行进程
[1]+ 15254 运行中               cp -i -r /opt/data/Packages/ /mnt &  //任务继续在后台运行

3、终止进程执行

  • kill命令——用于终止指定PID号的进程

    通过 kill 命令终止进程时,需要使用进程的 PID 号作为参数。无特定选项时,kill 命令将给该进程发送终止信号并正常退出运行,若该进程已经无法响应终止信号,则可以结合“-9”选项强行终止进程。

[root@localhost ~]# rm -rf /mnt/Packages/        //删除mnt目录下Packages目录为文件
[root@localhost ~]# cp -r /opt/data/Packages/ /mnt & //复制文件Packages到mnt目录,并在后台运行
[1] 15602
[root@localhost ~]# jobs -l   //查看后台运行任务,并显示PID号
[1]+ 15602 运行中               cp -i -r /opt/data/Packages/ /mnt &
[root@localhost ~]# kill 15602   //终止后台运行的PID号为15602的任务
[root@localhost ~]# jobs      //查看后台任务
[1]+  已终止               cp -i -r /opt/data/Packages/ /mnt  //任务已终止
[root@localhost ~]# rm -rf /mnt/Packages/    //删除mnt目录下Packages目录为文件
[root@localhost ~]# cp -r /opt/data/Packages/ /mnt & //复制文件Packages到mnt目录,并在后台运行
[1] 15754
[root@localhost ~]# kill -9 15754      //强制停止PID号为15754的任务
[root@localhost ~]# jobs -l           //查看后台任务信息
[1]+ 15754 已杀死               cp -i -r /opt/data/Packages/ /mnt   //任务强制停止
  • killall命令——用于终止指定名称的所有进程

    使用killall命令可以通过进程名称来终止进程,当需要结束系统中多个相同名称的进程时,使用 killall 命令将更加方便,效率更高。killall 命令同样也有“-9”选项。

[root@localhost ~]# rm -rf /mnt/Packages/              //删除mnt目录中刚复制的Packages
[root@localhost ~]# cp -r /opt/data/Packages/ /mnt & //复制文件Packages到mnt目录,并在后台运行
[1] 15825
[root@localhost ~]# cp -r /opt/data/Packages/ /boot &
[2] 15827                                        //复制文件Packages到目录boot,并在后台运行
[root@localhost ~]# killall cp                //停止全部cp任务
[1]-  已终止               cp -i -r /opt/data/Packages/ /mnt
[2]+  已终止               cp -i -r /opt/data/Packages/ /boot  //已全部停止
[root@localhost ~]# vim /mnt/data1 &           //编辑文件data1,并在后台运行
[1] 16007
[root@localhost ~]# vim /mnt/data2 &           //编辑文件data2,并在后台运行
[2] 16009

[1]+  已停止               vim /mnt/data1
[root@localhost ~]# jobs -l                  //查看后台运任务
[1]- 16007 停止 (tty 输出)     vim /mnt/data1
[2]+ 16009 停止 (tty 输出)     vim /mnt/data2
[root@localhost ~]# killall -9 vim             //强制结束后台vim程序
[1]-  已杀死               vim /mnt/data1  
[2]+  已杀死               vim /mnt/data2     //已强制停止
  • pkill命令——根据特定条件终止相应的进程

    使用 pkill命令可以根据进程的名称、运行该进程的用户、进程所在的终端等多种属性终止特定的进程,大部分选项与pgrep命令基本类似。

  • 常用选项

    -U:根据进程所属的用户名终止相应进程

    -t:根据进程所在的终端终止相应进程

    -9:强制结束进程(结合-U命令可以强制指定用户下线)

[root@localhost ~]# who      //查看登录用户
root     pts/0        2019-08-27 22:02 (192.168.144.1)
sun      :0           2019-08-27 20:04 (:0)
[root@localhost ~]# pkill -9 -U sun   //强制sun客户下线
[root@localhost ~]# who      //查看登录用户
root     pts/0        2019-08-27 22:02 (192.168.144.1)   //sun用户被踢出

计划任务管理

Linux 操作系统中,除了用户即时执行的命令操作以外,还可以配置在指定的时间、指定的日期执行预先计划的系统管理任务(如定期备份、定期采集监测数据)。CentOS 系统中默认已安装了atcronie软件包,通过 atdcrond这两个系统服务实现一次性、周期性计划任务的功能,并分别通过 atcrontab 命令进行计划任务设置。

at 一次性任务设置

设置一次性计划任务时,在at 命令行中依次指定计划执行任务的时间、日期作为参数(若只指定时间则表示当天的该时间,若只指定日期则表示该日期的当前时间),确认后将进入带“at&gt;”提示符的任务编辑界面,每行设置一条执行命令,可以依次设置多条语句,最后按 Ctrl+D 组合键提交任务。所设置的命令操作将在计划的时间点被依次执行。

  • 命令格式

    at [HH:MM] [YYYY-MM-DD]

  • atq命令:查看计划性任务
  • atrm [序列号]:删除任务
[root@localhost ~]# date                //获取当前时间
2019年 08月 27日 星期二 23:40:32 CST
[root@localhost ~]# at 23:45 2019-08-27   //设置一次性计划任务,在23:45分执行
at> ps aux | wc -l > /opt/ps.txt      //输入指令查看进程,并统计信息,生成文件ps.txt
at> <EOT>                           //输入结束后按Ctrl+D组合键提交任务
job 1 at Tue Aug 27 23:45:00 2019    
[root@localhost ~]# atq              //查看计划性任务
1   Tue Aug 27 23:45:00 2019 a root
[root@localhost ~]# date             //获取当前时间
2019年 08月 27日 星期二 23:46:51 CST
[root@localhost ~]# ls /opt            //查看计划性任务是否执行,看文件是否生成文件
data  ps.txt  rh                    //成功生成文件ps.txt
[root@localhost ~]# date
2019年 08月 27日 星期二 23:49:42 CST
[root@localhost ~]# at 23:53 2019-08-27    //设置一次性计划任务,在23:53分执行
at> ps aux | wc -l > /opt/ps1.txt        //输入指令查看进程,并统计信息,生成文件ps1.txt
at> <EOT>                                 //输入结束后按Ctrl+D组合键提交任务
job 2 at Tue Aug 27 23:53:00 2019
[root@localhost ~]# atq                //查看计划性任务
2   Tue Aug 27 23:53:00 2019 a root
[root@localhost ~]# atrm 2              //删除计划性任务2
[root@localhost ~]# atq                 //查看计划性任务
[root@localhost ~]#                     //成功删除

crontab 周期性任务设置

使用crontab 命令设置的计划任务可以按预设的周期重复执行,从而大大减轻设置重复性系统管理任务的操作。启用周期性任务也有一个前提条件,即对应的系统服务crond必须已经运行。

1、crontab 的配置文件和目录

  • /etc/crontab——系统任务配置文件
[root@localhost ~]# cat /etc/crontab
SHELL=/bin/bash                             //设置执行计划任务的 Shell 环境 
PATH=/sbin:/bin:/usr/sbin:/usr/bin          //定义可执行命令及程序的路径 
MAILTO=root                                 //将任务输出信息发送到指定用户的邮箱 

# For details see man 4 crontabs

# Example of job definition:
# .---------------- minute (0 - 59)
# |  .------------- hour (0 - 23)
# |  |  .---------- day of month (1 - 31)
# |  |  |  .------- month (1 - 12) OR jan,feb,mar,apr ...
# |  |  |  |  .---- day of week (0 - 6) (Sunday=0 or 7) OR sun,mon,tue,wed,thu,fri,sat
# |  |  |  |  |
# *  *  *  *  * user-name  command to be executed
  • /var/spool/cron/——用户 cron任务的配置文件存放目录

    由用户自行设置的cron计划任务将被保存到目录/var/spool/cron/中,文件名与用户名相同。

2、使用 crontab 命令管理用户的计划任务

  • 命令格式

    crontab [选项] [-u 用户名]

  • 常用选项

    -e :编辑计划任务

    -l:查看计划任务

    -r:删除计划任务

  • 周期性计划任务书写格式

    * * * * * run_command
    字段 含义 说明
    * 分钟 取值为0~59之间的任意整数
    * 小时 取值为0~23之间的任意整数
    * 日期 取值为1~31之间的任意整数
    * 月份 取值为1~12之间的任意整数
    * 星期 取值为0~7之间的任意整数,0或7代表星期日
    run_command 命令 要执行的命令或程序脚本
  • 时间数值的特殊表示方法
    “*”:表示该范围内的任意时间

    “,”:表示间隔的多个不连续的时间点

    “-”:表示一个连续的时间范围

    “/”:指定间隔的时间频率

    
    [root@localhost ~]# crontab -e             //编辑周期性计划任务

33 00 /usr/bin/cp -r /home/sun /opt/ //每天00:33分执行复制命令
~
~
:wq //保存退出
[root@localhost ~]# crontab -l //查看周期性计划任务
33 00
/usr/bin/cp -r /home/sun /opt/ //设置的周期性计划任务
[root@localhost ~]# crontab -r //删除周期性计划任务
[root@localhost ~]# crontab -l //查看周期性计划任务
no crontab for root //没有设置的周期性计划任务



谢谢观看,希望能够帮助到大家!!!