关于Linux进程管理,你该了解这些

一、什么是程序和进程?

  程序:一组计算机能识别和执行的指令集合,可以按照既定的逻辑控制计算机运行来完成特定的功能。
  进程正在运行的程序,是操作系统进行资源分配和调度的基本单位,每个进程都有独立的地址空间,并且占用一定的系统资源。

区别和关系:
   程序是静态的,它只是一组指令的集合,而进程是程序运行的动态过程。
   进程和程序并不是一一对应的关系,同一个程序运行在不同的数据集上就是不同的进程。
   程序是封闭的,而进程具有并发性和交往性。

二、什么是线程?

  线程:操作系统能够进行运算调度的最小单位,它被包含在进程之中,是进程中的实际运作单位。

线程与进程的关系:
   一个进程可以拥有多个线程,而一个线程同时只能被一个进程所拥有。
   线程不能单独执行,但每一个线程都有程序入口、执行序列以及程序出口,它必须组成进程才能被执行。

三、进程的生命周期

在这里插入图片描述
  父进程调用fork()系统调用得到一个新的(子)进程描述且分配一个唯一的进程ID(PID),并复制该值到父进程描述的子进程中,父子进程共享相同的地址空间,此时父进程将被堵塞,直到子进程退出或执行exec()系统调用才会继续运行。
  exec()系统调用复制新的程序到子进程的地址空间,因为与父进程共享地址空间,会产生一个分页错误,系统会为子进程分配新的物理内存。
  当程序执行完成后,子进程会调用exit()系统调用,释放进程大部分的数据并发送一个信号通知其父进程。此时子进程就变为一个僵尸进程(zombie)。
  当父进程接受到了子进程的终止信号,它会释放子进程的所有的资源。

四、进程启动方式

1、手动启动

  手工启动进程指的是由用户输入命令直接启动一个进程,根据所启动的进程类型和性质的不同,又可以细分为前台启动和后台启动 2 种方式。
  Ⅰ、前台启动
  手工启动一个进程的最常用的方式,在 Shell 提示处输入命令后,创建一个子进程并运行命令,Shell 等待命令退出,然后返回到对用户给出提示符。这条命令与 Shell 同步运行,即在前台运行,用户在它完成之前不能执行别的命令。
  Ⅱ、后台启动
  在 Shell 提示处输入命令时,在其后加一个" &"(&前面有空格),创建一个子进程并运行命令,但不等待命令退出,而直接返回到对用户给出提示符。这条命令与 Shell 异步运行,即在后台运行。进程直接从后台运行,用的相对较少,除非该进程非常耗时,且用户也不急着需要其运行结果的时候,且后台进程必须是非交互式的。

2、调度启动(定时任务)

  在 Linux 系统中,任务可以被配置在指定的时间、日期或者系统平均负载量低于指定值时自动启动,执行结果会通过邮件发给用户。这里需要使用到 at 命令crontab 命令

(1)、at 命令

  • 命令解释

  at, batch, atq, atrm - queue, examine or delete jobs for later execution(排队、检查或删除作业以供以后执行)
  如果某项工作在特定的时间执行一次,就可以使用 at 命令。

  可以看到上面的 at 说明中还有其他相关命令,其中:

命 令 解 释
atq 列出用户的计划任务,如果是超级管理员则会列出所有用户的计划任务
atrm 根据工作号删除 at 的定时任务
batch 在系统空闲的情况下执行 at 定时任务

  at 命令在使用之前需要安装,并开启独立的 atd 服务。

[root@localhost ~]# yum install at    //安装at命令
[root@localhost ~]# service atd start    //启动atd服务
Starting atd:                                              [  OK  ]

  • 命令语法
      at [选项] 时间
  • 命令常用选项
选 项 作 用
-m 当 at 工作完成后,无论命令是否输出,都用 E-mail 通知执行 at 命令的用户
-d 删除某个工作,同 atrm 命令的作用相同
-l 列出当前所有等待运行的工作,和 atq 命令的作用相同
-f 文件 读取脚本文件
-c 工作号 根据工作号显示 at 工作的实际内容
  • 时间参数的格式
格 式 解 释
 HH:MM  24小时制,例如:13:14
 Midnight  表示 00:00
 Noon  表示 12:00
 Teatime  表示 16:00
MMDDYY
MM/DD/YY
MM-DD-YY
MM.DD.YY
例如:021520,表示2020年2月15日
 now + 时间  相对时间,时间单位可选:minutes、hours、days 和 weeks ,例如:now + 5 minutes,表示5分钟后执行
  • 实例

  ① 三天后重启网络;

[root@localhost ~]# at now + 3 days
at> service network restart
job 1 at 2020-04-25 18:53    //使用Ctrl+d组合键保存

  ② 查看at的定时任务

[root@localhost ~]# atq    //两个命令都可以
1       2020-04-25 18:53 a root
[root@localhost ~]# at -l
1       2020-04-25 18:53 a root

  ③ 查看at的定时任务的实际内容

[root@localhost ~]# at -c 1    //查看工作号为1的任务实际内容
#!/bin/sh
# atrun uid=0 gid=0
# mail root 0
umask 22
...省略部分内容
service network restart    //这里就是啦
marcinDELIMITER53857a3a

  ④ 删除at的定时任务

[root@localhost ~]# atrm 1
[root@localhost ~]# at -d 1    //两个命令都可以
Cannot find jobid 1    //因为上一个命令已经删除工作号为1的作业,所以找不到作业
[root@localhost ~]# atq

(2)、crontab 命令

  • 命令解释

  crontab - maintain crontab files for individual users(为单个用户维护crontab文件)
  在前面所讲到的 at 命令只能在特定时间执行一次任务,显然在实际工作中是不够的,这就需要 crontab 命令来重复执行定时任务。

  首先来了解一下 crond,它是Linux下用来周期性地执行某种任务或等待处理某些事件的一个守护进程,与Windows的计划任务类似,当安装完成操作系统后,默认会安装此服务工具,并且会自动启动 crond 进程。crond 进程每分钟会定期检查是否有要执行的任务,如果有要执行的任务,则会自动执行该任务。

  • 命令语法
      crontab [选项]
  • 命令常用选项
选 项 作 用
-u user 指定用户,如果不指定,则表示当前用户
-l 列出指定用户的计划任务列表
-e 编辑指定用户的计划任务列表
-r 删除指定用户的计划任务列表
-i 交互模式,即给出确认提示
  • 编辑计划任务(重点)

  使用 crontab -e 可以编辑用户自己的计划任务(一个空文件,格式需要自己编写),如果定时任务需要系统执行,这是就需要编辑 /etc/crontab 这个配置文件。

[root@localhost ~]# cat /etc/crontab    #/etc/crontab 文件对计划任务的格式有一定的提示信息,我们以它来初步了解计划任务的语法格式
SHELL=/bin/bash    #标识使用的Shell
PATH=/sbin:/bin:/usr/sbin:/usr/bin    #指定PATH环境变量
MAILTO=root    #如果命令结果或报错有输出,则会向root发送信息
HOME=/    #标识主目录

# For details see man 4 crontabs    #以上内容是crontab的环境变量,用户编写自己的计划任务时不需要写的哦!

# 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    #在编写系统定时任务时,一定要注意指明 user—name

  用户自己的计划任务的规则语法格式,与系统定时任务大同小异,也是以行为单位,一行则为一个计划,但唯一的区别是不需要指定用户名分 时 日 月 周 需要执行的命令

  下面我们对计划任务的规则语法格式具体进行介绍;

  取值范围:

时 间 范 围
分 (一小时中的第几分钟) 0~59
时 (一天中的第几时) 0~23
日 (一个月中的第几日) 1~31
月 (一年中的第几月) 1~12
周 (一个周中的星期几) 0~7,0和7表示星期天

  四个符号:

符 号 含 义
* 表示取值范围中的每一个数字
- 表示连续的时间范围。在周的位置写:1-7,表示周一到周天
, 表示间断的时间范围。在时的位置写:1,4,7,表示1点、4点和7点
/ 代表每隔多久执行一次。在分的位置写:*/10,表示每隔十分钟
  • Crontab权限问题

  超级管理员可以通过配置 /etc/cron.allow (白名单) 和 /etc/cron.deny (黑名单) 两个文件来限制某些用户是否可以使用 crontab 命令,配置时在这两个名单中每行写一个用户名,即可达到效果。
   当系统中有 /etc/cron.allow 文件时,只有写入此文件的用户可以使用 crontab 命令,没有写入的用户不能使用 crontab 命令。
   当系统中只有 /etc/cron.deny 文件时,写入此文件的用户不能使用 crontab 命令,没有写入的用户则可以使用 crontab 命令。
   白名单优先级高于黑名单,如果一个用户同时存在两个名单文件中,则可以使用 crontab 命令。

  • 实例

  ① 每小时的第5分钟和第15分钟向 /tmp/testfile 文件内写入当前时间;

5,15 * * * * date >> /tmp/testfile

  ② 每天上午的8~12点的第5分钟和第15分钟重启网络

5,15 8-12 * * * service network restart

  ③ 每隔2天的上午的8-12点的第5分钟和第15分钟重启系统

5,15 8-12 */2 * * reboot

  ④ 每星期一的晚上23:30重启crond服务

30 23 * * 1 service crond restart

五、作业控制

1、什么是作业和作业控制?

  一个正在执行的进程称为一个作业,而且作业可以包含一个或多个进程,尤其是当使用了管道和重定向命令。
  作业控制指的是控制正在运行的进程的行为,比如:启动、停止、强制终止、恢复以及异步运行作业的这些功能,让shell可以在子进程运行期间返回接受其他命令。

  一般而言,进程与作业控制相关联时,才被称为作业。

2、将作业放入后台

  命令后面加上" &"(&前面有空格),可以把这个命令放到后台执行

[root@localhost ~]# sleep 1m &
[1] 1850   //工作号(每个后台命令都会分配) 进程号

   命令执行过裎中按 Ctrl+Z 组合键,命令会放到后台并处于暂停状态

[root@localhost ~]# sleep 1m
^Z
[1]+  Stopped                 sleep 1m

3、查看当前终端放入后台的作业

  使用 jobs 命令可以查看当前终端放入后台的工作,命令语法: jobs 命令 [&] ;

命令常用选项

选 项 作 用
-l 列出进程的 PID
-p 只列出进程的 PID
-r 只列出运行中的进程
-s 只列出已停止的进程
-n 只列出最近一次状态改变的进程

实例

  查看放入后台的作业;

[root@localhost ~]# jobs -l
[1]   1850 Done                    sleep 1m &
[2]-  1851 run                 	   sleep 2m
[3]+  1852 Stopped                 sleep 3m

  当前终端有三个后台作业。其中,第一个字段为工作号;"+/-" 代表最近 "第一个/第二个"放入后台的作业;因为使用 -l 选项,所以第三个字段列出了进程的 PID;第四个字段表示作业的状态,Done、run、Stopped 和 terminated 分别表示 完成、运行中、暂停、终止状态;最后一个字段为启动作业的命令。

4、将后台暂停的作业恢复执行

  前面我们讲到将作业放入后台,使用 Ctrl+z 组合键时,作业进入后台并且处于暂停状态。有什么办法让作业在后台恢复执行吗?

  答案是有的!这就需要用到 bg 命令命令语法: bg %工作号 ;

[root@localhost ~]# sleep 1m    //使用Ctrl+z键将作业放入后台并暂停状态
^Z
[1]+  Stopped                 sleep 1m
[root@localhost ~]# bg %1    //恢复执行状态
[1]+ sleep 1m &
[root@localhost ~]# jobs    //查看状态
[1]+  Running                 sleep 1m &

5、将后台作业恢复前台执行

  之前所讲的都是讲作业放到后台执行,那么有什么办法让后台作业恢复到前台执行吗?

  答案当然是有的!fg 命令就可以做到!命令语法: fg %工作号 ;

[root@localhost ~]# sleep 1m &    //后台执行作业
[1] 2072
[root@localhost ~]# fg %1    //恢复前台执行状态
sleep 1m

6、杀死后台作业

  很简单,使用 kill %工作号 就可以!

[root@localhost ~]# sleep 1m &    //后台执行作业
[1] 2073
[root@localhost ~]# kill %1    //杀死工作号为1的作业
[root@localhost ~]# jobs    //终止状态
[1]+  Terminated              sleep 1m

7、不挂断地运行作业

  一般当我们断开终端时,终端会收到SIGHUP信号从而关闭所有子进程。如果不希望某些进程被这个SIGHUP信号影响,就需要用到 nohup 命令。nohup 命令可以让后台作业在离开终端时,也能正确地在后台执行。命令语法: nohup 命令 & ;

[root@localhost ~]# nohup ping www.baidu.com &
[1] 2413
[root@localhost ~]# nohup: 忽略输入并把输出追加到 `nohup.out'

tips: ① 无论是否将 nohup 命令的输出重定向到终端,输出都将附加到当前目录的 nohup.out 文件中。
   ② 如果当前目录的 nohup.out 文件不可写,输出重定向到 $HOME/nohup.out 文件中。
   ③ 如果没有文件能创建或打开以用于追加,那么 Command 参数指定的命令不可调用。

六、进程优先级

  在Linux系统中,表示进程优先级的有两个数值:nice(NI)priority(PR)。其中,我们只能通过修改nice值(也叫静态优先级)来调整进程优先级,因为priority值是由内核动态调整的(也叫动态优先级),用户是不能直接修改的。

  他们之间存在着这样的关系:

PR(最终值)= PR (原始值) + NI
PR(最终值)数值越小,代表该进程的优先级越高,在同一个CPU调度周期中所占的时间更长。

  所以说,nice值越小,进程的优先级就越高;反之,nice值越大,进程的优先级就越低。我们可以通过 renice 命令来调整一个进程的nice值。
  其中,我们需要注意的是:
    ① nice的取值范围为:fuhao-20~19,一共四十个级别;
    ② 普通用户只能调整自己的进程,调整nice值的范围为 0~19,且不能降低nice值,即只能降低进程的优先级;
    ③ root用户可以调整任何用户的进程,并且在nice值的取值范围内可以任意调整。

1、查看nice值

  ① 使用ps命令;

[root@localhost ~]# ps -le    //第八个字段即为nice值
F S   UID    PID   PPID  C PRI  NI ADDR SZ WCHAN  TTY          TIME CMD
4 S     0      1      0  0  80   0 -  4840 poll_s ?        00:00:01 init
1 S     0      2      0  0  80   0 -     0 kthrea ?        00:00:00 kthreadd
1 S     0      3      2  0 -40   - -     0 migrat ?        00:00:00 migration/0
1 S     0      4      2  0  80   0 -     0 ksofti ?        00:00:00 ksoftirqd/0
1 S     0      5      2  0 -40   - -     0 cpu_st ?        00:00:00 stopper/0
...省略部分信息

  ② 使用top命令;

[root@localhost ~]# top    //第四个字段即为nice值
top - 20:00:35 up  5:56,  1 user,  load average: 0.08, 0.03, 0.05
Tasks:  88 total,   1 running,  87 sleeping,   0 stopped,   0 zombie
Cpu(s):  0.3%us,  0.3%sy,  0.0%ni, 99.3%id,  0.0%wa,  0.0%hi,  0.0%si,  0.0%st
Mem:   1004136k total,   235572k used,   768564k free,    47332k buffers
Swap:  2097148k total,        0k used,  2097148k free,    54556k cached

   PID USER      PR  NI  VIRT  RES  SHR S %CPU %MEM    TIME+  COMMAND
  2665 root      20   0 15024 1292  996 R  0.3  0.1   0:00.41 top
     1 root      20   0 19360 1524 1228 S  0.0  0.2   0:01.41 init
     2 root      20   0     0    0    0 S  0.0  0.0   0:00.00 kthreadd
     3 root      RT   0     0    0    0 S  0.0  0.0   0:00.00 migration/0
     4 root      20   0     0    0    0 S  0.0  0.0   0:00.01 ksoftirqd/0
     5 root      RT   0     0    0    0 S  0.0  0.0   0:00.00 stopper/0
...省略部分信息

2、修改nice值

  可以通过 nice 命令renice 命令 对 nice 值进行调整。其中,nice命令可以对要启动的程序赋予 nice 值,而 renice命令可以对进程的 nice 值进行修改。

  ① nice命令;

  命令语法: nice [-n nice值] 命令 ;

[root@localhost ~]# nice -n -5 /usr/local/httpd-2.4.41/bin/apachectl start    //启动httpd服务并赋予nice值为-5
[root@localhost ~]# ps -le | grep httpd    //可以看到所有的httpd进程nice值都为-5
1 S     0   2117      1  0  75  -5 - 17593 poll_s ?        00:00:00 httpd
5 S     2   2118   2117  0  75  -5 - 103658 pipe_w ?       00:00:00 httpd
5 S     2   2119   2117  0  75  -5 - 103658 pipe_w ?       00:00:00 httpd
5 S     2   2120   2117  0  75  -5 - 103658 pipe_w ?       00:00:00 httpd

  ② renice命令;

  命令语法: renice [nice值] PID ;

[root@localhost ~]# /usr/local/httpd-2.4.41/bin/apachectl start    //启动httpd服务
[root@localhost ~]# ps -le | grep httpd    //查看httpd服务的进程信息
1 S     0  21910      1  0  80   0 - 17593 poll_s ?        00:00:00 httpd
5 S     2  21911  21910  0  80   0 - 103658 pipe_w ?       00:00:00 httpd
5 S     2  21912  21910  0  80   0 - 103658 pipe_w ?       00:00:00 httpd
5 S     2  21913  21910  0  80   0 - 103658 pipe_w ?       00:00:00 httpd
[root@localhost ~]# renice -10 21913    //修改进程号为21913的进程nice值为-10
21913: old priority 0, new priority -10
[root@localhost ~]# ps -le | grep httpd | grep 21913    //可以看到已经修改成功
5 S     2  21913  21910  0  70 -10 - 103658 pipe_w ?       00:00:00 httpd

七、进程管理命令

1、ps命令

  • 命令解释
      ps - report a snapshot of the current processes(查看当前系统中所有运行进程的状态)
  • 命令语法
      ps [选项]
  • 命令常用选项
选 项 作 用
a 显示所有终端的所有进程,除了阶段作业领导者之外
-a 显示当前终端的所有进程,包括其他用户的进程
-u 显示进程的归属用户及内存的使用情况
x 显示没有控制终端的进程
-A 或 -e 显示所有进程
-f 显示较为详细的信息
-l 长格式显示更加详细的信息

  通常我们使用 ps -auxps -ef 配合管道符号(|)来查看特定进程的状态信息。

  • ps aux 命令执行结果各字段解释;
[root@localhost ~]# ps aux
USER        PID %CPU %MEM    VSZ   RSS TTY      STAT START   TIME COMMAND
root          1  0.0  0.1  19360  1524 ?        Ss   21:47   0:01 /sbin/init
root          2  0.0  0.0      0     0 ?        S    21:47   0:00 [kthreadd]
root          3  0.0  0.0      0     0 ?        S    21:47   0:00 [migration/0]
root          4  0.0  0.0      0     0 ?        S    21:47   0:00 [ksoftirqd/0]
root          5  0.0  0.0      0     0 ?        S    21:47   0:00 [stopper/0]
root          6  0.0  0.0      0     0 ?        S    21:47   0:00 [watchdog/0]
...省略部分信息

  下表对各字段的含义进行解释:

字 段 含 义
USER 运行该进程的用户名称
PID 该进程的 ID
%CPU 该进程占用CPU的百分比
%MEM 该进程占用物理内存的百分比
VSZ 该进程占用虚拟内存的大小,单位为 KB
RSS 该进程占用实际物理内存的大小,单位为 KB
TTY 该进程是在哪个终端运行的。其中,tty1 ~ tty7 代表本地控制台终端,pts/0 ~ 255 代表虚拟终端,一般是远程连接的终端
STAT 该进程的状态。D:不可中断的睡眠状态,通常用于 I/O 情况;S:睡眠状态,可被唤醒;T:停止状态;R:正在运行;Z:僵尸进程,进程已经终止,但仍然占用一些系统资源;-<:高优先级;-N:低优先级;-s:包含子进程;-l:多线程;-+:位于后台
START 进程的启动时间
TIME 该进程占用 CPU 的时间
COMMAND 产生该进程的命令名
  • ps -le 命令执行结果各字段解释;
[root@localhost ~]# ps -le
F S   UID    PID   PPID  C PRI  NI ADDR SZ WCHAN  TTY          TIME CMD
4 S     0      1      0  0  80   0 -  4840 poll_s ?        00:00:01 init
1 S     0      2      0  0  80   0 -     0 kthrea ?        00:00:00 kthreadd
1 S     0      3      2  0 -40   - -     0 migrat ?        00:00:00 migration/0
1 S     0      4      2  0  80   0 -     0 ksofti ?        00:00:00 ksoftirqd/0
1 S     0      5      2  0 -40   - -     0 cpu_st ?        00:00:00 stopper/0
1 S     0      6      2  0 -40   - -     0 watchd ?        00:00:00 watchdog/0
...省略部分信息

  下表对各字段的含义进行解释:

字 段 含 义
F 进程标志,表示进程的权限,常见的有:1 进程可以被复制,但不能被执行;4 进程使用超级用户权限
S 该进程的状态,具体与"ps aux"中的STAT字段相同
UID 运行该进程的用户 ID
PID 该进程的 ID
PPID 该进程父进程的 ID
C 该进程占用CPU的百分比
PRI 动态优先级(priority),由内核动态调整
NI 静态优先级(nice),用户可以进行调整
ADDR 该进程在内存中的位置
SZ 该进程占用内存的大小
WCHAN 该进程是否运行。"-"代表正在运行
TTY 该进程是在哪个终端运行的
TIME 该进程占用 CPU 的时间
CMD 产生该进程的命令名
  • 实例

  查看http服务的进程状态;

[root@localhost ~]# ps -ef | grep httpd
root       2155      1  0 00:44 ?        00:00:00 /usr/sbin/httpd
apache     2157   2155  0 00:44 ?        00:00:00 /usr/sbin/httpd
apache     2158   2155  0 00:44 ?        00:00:00 /usr/sbin/httpd
apache     2159   2155  0 00:44 ?        00:00:00 /usr/sbin/httpd
apache     2160   2155  0 00:44 ?        00:00:00 /usr/sbin/httpd
apache     2161   2155  0 00:44 ?        00:00:00 /usr/sbin/httpd
apache     2162   2155  0 00:44 ?        00:00:00 /usr/sbin/httpd
apache     2163   2155  0 00:44 ?        00:00:00 /usr/sbin/httpd
apache     2164   2155  0 00:44 ?        00:00:00 /usr/sbin/httpd
root       2166   1804  0 00:44 pts/0    00:00:00 grep httpd

2、pstree命令

  • 命令解释
      pstree - display a tree of processes(以树形结构显示进程之间的关系)

使用命令 yum install psmisc 安装 pstree 命令。

  • 命令语法
      ps [选项]
  • 命令常用选项
选 项 作 用
-A 使用ASCII字符绘制树
-U 使用UTF-8字符绘制树
-p 显示进程的 PID
-u 显示进程对应的用户名称
  • 实例

  查看进程树

[root@localhost ~]# pstree
init─┬─NetworkManager─┬─dhclient    //其中init进程是系统启动的第一个进程,是系统中所有进程的父进程
     │                └─{NetworkManager}
     ├─atd
     ├─auditd───{auditd}
     ├─crond
     ├─dbus-daemon───{dbus-daemon}
     ├─hald─┬─hald-runner─┬─hald-addon-acpi
     │      │             └─hald-addon-inpu
     │      └─{hald}
     ├─master─┬─pickup
     │        └─qmgr
     ├─6*[mingetty]
     ├─modem-manager
     ├─rsyslogd───3*[{rsyslogd}]
     ├─sshd─┬─sshd───bash───pstree
     │      └─sshd───sftp-server
     ├─udevd───2*[udevd]
     └─wpa_supplicant

3、pgrep命令

  • 命令解释
      pstree - look up based on name(根据进程名来查询进程)
      一般是用来判断程序是否正在运行。
  • 命令语法
      pgrep [选项] [pattern]
  • 命令常用选项
选 项 作 用
-l 同时显示 PID 和进程名称
-o 即 old,当匹配程序有多个进程时,显示进程号最小的那个(最先启动的)
-n 即 new,当匹配程序有多个进程时,显示进程号最大的那个(进程号越大,并不一定意味进程的启动时间越晚)
  • 实例

  ① 查看httpd服务的进程 ID 和名称;

[root@localhost ~]# pgrep -l  httpd
2106 httpd
2108 httpd
2109 httpd
2110 httpd
2111 httpd
2112 httpd
2113 httpd
2114 httpd
2115 httpd

  ② 查看httpd服务最先启动的进程 ID;

[root@localhost ~]# pgrep -o  httpd
2106

4、kill命令

  • 命令解释
      kill - terminate a process(终止指定的进程)
      kill 从字面意义看起来是杀死进程,但从本质来讲,kill 命令只是向进程发送一个信号,这个信号是什么取决于用户。
  • 命令语法
      kill [-信号] PID
      kill 命令重点在于信号而不在选项,所以这里不作描述。
  • 常用信号
信 号 信号名 含 义
0 SIGEXIT 不发送任何信号,一般用来检查一个进程是否存在
1 SIGHUP 断开终端连接,这个信号也会造成某些进程在没有终止的情况下重新初始化
2 SIGINT 结束进程,但并不是强制性的,相当于组合键 “Ctrl+c”
3 SIGQUIT 退出,相当于组合键 “Ctrl+/”
9 SIGKILL 杀死进程,即强制结束进程
15 SIGTERM 正常结束进程,是 kill 命令的默认信号
18 SIGCONT 恢复进程的执行
19 SIGSTOP 暂停进程的执行,相当于组合键 “Ctrl+z”

  如果需要查看所有信号及其对应编号,可以使用 kill -l 命令,通过对这里的了解,我们可以知道kill 命令只是发送一个"信号",所以只有当信号被成功捕获的时候 kill 命令才能发挥相应的作用。

  • 实例

  ① 结束httpd服务的一个子进程;

[root@localhost ~]# pstree -p | grep httpd    //查看httpd服务
        |-httpd(1922)-+-httpd(1924)
        |             |-httpd(1925)
        |             |-httpd(1926)
        |             |-httpd(1927)
        |             |-httpd(1928)
        |             |-httpd(1929)
        |             |-httpd(1930)
        |             `-httpd(1931)
[root@localhost ~]# kill 1931    //杀死PID为1931的httpd进程,正常停止
[root@localhost ~]# pstree -p | grep httpd
        |-httpd(1922)-+-httpd(1924)
        |             |-httpd(1925)
        |             |-httpd(1926)
        |             |-httpd(1927)
        |             |-httpd(1928)
        |             |-httpd(1929)
        |             `-httpd(1930)    //可以发现进程号为1931的子进程已经结束

  ② 重启进程;

[root@localhost ~]# kill -1 1922    //-1信号,可以让进程重新启动
[root@localhost ~]# pstree -p | grep httpd
        |-httpd(1922)-+-httpd(1953)
        |             |-httpd(1954)
        |             |-httpd(1955)
        |             |-httpd(1956)
        |             |-httpd(1957)
        |             |-httpd(1958)
        |             |-httpd(1959)
        |             `-httpd(1960)    //httpd服务的子进程PID都改变了,说明重启成功

5、killall命令

  • 命令解释
      killall - kill processes by name(根据名字终止进程)
      killall 命令不再和 kill 命令只能通过 PID 来杀死单个进程,而是通过进程名来杀死一类进程。可以和 ps、pstree 等命令配合使用。
  • 命令语法
      kill [-信号] 进程名
  • 常用信号
      信号与 kill 命令是一致的,所以这里省略掉啦!
  • 实例

  结束httpd服务

[root@localhost ~]# pstree -p | grep httpd    //查看httpd服务
        |-httpd(1922)-+-httpd(1953)
        |             |-httpd(1954)
        |             |-httpd(1955)
        |             |-httpd(1956)
        |             |-httpd(1957)
        |             |-httpd(1958)
        |             |-httpd(1959)
        |             `-httpd(1960)
[root@localhost ~]# killall httpd    //直接指定进程名结束进程
[root@localhost ~]# pstree -p | grep httpd    //httpd服务已经正常结束

6、pkill命令

  • 命令解释
      pkill - signal processes based on name and other attributes(根据进程名和其他属性进程处理信号)
      pkill 是 ps 命令和 kill 命令的结合,与 killall 命令的用法相同,都是通过进程名杀死一类进程。除此之外 pkill 命令可以用来踢出登录用户。
  • 命令语法
      pkill [-信号] [-t 终端号] 进程名
  • 常用信号
      信号与 kill 命令是一致的,同样这里省略掉啦!
  • 实例

  ① 结束httpd服务

[root@localhost ~]# pstree -p | grep httpd    //查看httpd服务
        |-httpd(2251)-+-httpd(2253)
        |             |-httpd(2254)
        |             |-httpd(2255)
        |             |-httpd(2256)
        |             |-httpd(2257)
        |             |-httpd(2258)
        |             |-httpd(2259)
        |             `-httpd(2260)
[root@localhost ~]# pkill httpd    //直接指定进程名结束进程
[root@localhost ~]# pstree -p | grep httpd    //httpd服务已经正常结束

  ② 踢出登录用户

[root@localhost ~]# who    //查看本机已登录的用户
root     pts/0        2020-04-15 11:39 (192.168.140.1)
root     pts/1        2020-04-15 13:08 (192.168.140.1)    //两个root用户已经远程登录
[root@localhost ~]# pkill -9 -t pts/1    //强制杀死从pts/1虚拟终端登录的进程
[root@localhost ~]# who
root     pts/0        2020-04-15 11:39 (192.168.140.1)    //虚拟终端pts/1的登录进程已经被杀死

7、top命令

  • 命令解释
      top - display Linux tasks(显示Linux任务)
      top 可以动态地持续监听进程的运行状态,并且还提供了一个交互界面,可以根据需求个性化地制定输出内容,对某一资源使用情况的字段进行排序等操作。
  • 命令语法
      top [选项]
  • 命令常用选项
选 项 作  用
-d 秒数 指定 top 命令每隔几秒更新,默认为3秒
-n 次数 指定 top 命令执行的次数
-b 批处理模式,一般与"-n"选项合用,用于把top命令重定向到文件中
-p 进程PID 仅监听指定 PID 的进程
-u 用户名 仅监听指定用户的进程
  • top 命令执行结果各字段解释
top - 19:13:02 up  7:34,  1 user,  load average: 0.00, 0.01, 0.05
Tasks:  88 total,   1 running,  87 sleeping,   0 stopped,   0 zombie
Cpu(s):  0.3%us,  0.0%sy,  0.0%ni, 99.7%id,  0.0%wa,  0.0%hi,  0.0%si,  0.0%st
Mem:   1004136k total,   219592k used,   784544k free,    28220k buffers
Swap:  2097148k total,        0k used,  2097148k free,    58320k cached

   PID USER      PR  NI  VIRT  RES  SHR S %CPU %MEM    TIME+  COMMAND
     1 root      20   0 19360 1524 1228 S  0.0  0.2   0:01.50 init
     2 root      20   0     0    0    0 S  0.0  0.0   0:00.00 kthreadd
     3 root      RT   0     0    0    0 S  0.0  0.0   0:00.00 migration/0
     4 root      20   0     0    0    0 S  0.0  0.0   0:00.00 ksoftirqd/0
     5 root      RT   0     0    0    0 S  0.0  0.0   0:00.00 stopper/0
     6 root      RT   0     0    0    0 S  0.0  0.0   0:00.04 watchdog/0
...省略部分信息

  第一行为任务队列信息,与 uptime 命令执行结果相同,具体含义如下:

字 段 解 释
19:13:02 系统当前时间
up 1 day, 7:34 系统的运行时间。本机已经运行1天7小时34分钟
1 user 当前登录了一个用户
load average: 0.00, 0.01, 0.05 系统在1分钟内、5分钟内、15分钟内的平均负载。如果这些数值高于cpu的数量,则你的系统可能在超负荷运转

  第二行为进程(Tasks) 信息,具体含义如下:

字 段 解 释
88 total 系统中的进程总数
1 running 正在运行的进程数
87 sleeping 睡眠的进程数
0 stopped 停止的进程数
0 zombie 僵尸进程数

  第三行为 CPU(Cpu(s)) 信息,具体含义如下:

字 段 解 释
0.3%us 用户空间占用的 CPU 百分比
0.0%sy 系统空间占用的 CPU 百分比
0.0%ni 改变过优先级的进程的 CPU 百分比
99.7%id 空闲 CPU 占用的 CPU 百分比
0.0%wa 等待 I/O 的进程占用的 CPU 百分比
0.0%hi 处理硬中断占用的 CPU 百分比
0.0%si 处理软中断占用的 CPU 百分比
0.0%st 虚拟时间百分比。即当有虚拟机时,虚拟 CPU 等待实际 CPU 的时间百分比

  第四行为物理内存(Mem) 信息,具体含义如下:

字 段 解 释
1004136k total 物理内存的总量
219592k used 己经使用的物理内存大小
784544k free 空闲的物理内存大小
28220k buffers 作为缓冲的内存大小

  第五行为交换分区(Swap) 信息,具体含义如下:

字 段 解 释
2097148k total 交换分区的大小
0k used 已经使用的交换分区的大小
2097148k free 空闲交换分区的大小
58320k cached 作为缓存的交换分区的大小

  再往下所有行为系统进程信息,各字段的含义如下:

字 段 解 释
PID 该进程的 ID
USER 该进程所属的用户
PR 优先级(系统内核层面的概念),数值越小优先级越高
NI 优先级(nice值,用户层面的概念),数值越小、优先级越高
VIRT 该进程使用的虚拟内存的大小,单位为 KB
RES 该进程使用的物理内存的大小,单位为 KB
SHR 该进程使用的共享内存大小,单位为 KB
S 该进程状态
%CPU 该进程占用 CPU 的百分比
%MEM 该进程占用内存的百分比
TIME+ 该进程共占用的 CPU 时间
COMMAND 运行该进程使用的命令名
  • 实用的一些交互操作

① 显示全部CPU核心的负载情况;

  在 top 基本视图中,按下键盘数字"1",可以显示全部CPU核心的负载情况。再次按下"1",就会隐藏它们。
在这里插入图片描述
② 背光模式;

  按下键盘"b",可以进入背光模式,默认为当前处于运行(running)态的进程加上背光。按键"y"可以对处于运行(running)态的进程加上/取消背光,按键"x"可以对排序字段加上/取消背光
在这里插入图片描述

③ 字段排序;

  top 默认是以占用CPU的百分比来排序的,通过组合键"shift + >"或"shift + <"可以向右或向左改变排序列。
  按一次"shift + >"即可以占用内存的百分比(%MEM)来进行排序。
在这里插入图片描述

8、vmstat命令

  • 命令解释
      vmstat - Report virtual memory statistics(报告虚拟内存统计信息)
      vmstat 可以动态地监控系统总体的资源使用情况,例如 CPU 使用、进程状态、内存使用、虚拟内存使用、硬盘输入/输出状态等信息。
  • 命令语法
      vmstat [选项] [刷新间隔时间 [ 刷新次数]]
  • 命令常用选项
选 项 作  用
-a 显示活跃和非活跃内存
-d 显示各个磁盘相关统计信息
-D 显示磁盘整体信息
-p 分区设备文件名 显示指定磁盘分区统计信息
-s 显示内存相关统计信息和多种系统活动数量
-t 将时间戳添加到输出内容中
-s 单位 使用指定单位显示。单位:k、K、m、M分别代表 1000、1024、1000000、1048576字节(bytes),默认为k(1024bytes)
-V 显示vmstat版本信息
  • vmstat 命令执行结果各字段解释;
[root@localhost ~]# vmstat
procs -----------memory---------- ---swap-- -----io---- --system-- -----cpu-----
 r  b   swpd   free   buff  cache   si   so    bi    bo   in   cs us sy id wa st
 0  0      0 584440  44204 216116    0    0     4     7   17   16  0  0 99  0  0

  下表对各字段的含义进行解释:

字 段 选 项 解 释 说 明
procs r 等待运行的进程数 数值越大,系统越繁忙。当这个值超过CPU个数,就会出现CPU瓶颈
b 等待I/O的进程数量 数值越大,系统越繁忙
memory swpd 已使用虚拟内存大小 当值大于0时,表示物理内存不足,需要考虑升级内存
free 空闲内存大小 指物理内存空闲大小
buff 用作缓冲的内存大小 缓冲(buffer):用于存储速度不同步的设备或优先级不同的设备之间传输数据。向硬盘写入数据时,先把数据放入缓冲区,然后再一起向硬盘写入,把分散的写操作集中进行,减少磁盘碎片和硬盘的反复寻道,从而提高系统性能
cache 用作缓存的内存大小 缓存(cache):位于CPU和主内存之间的容量较小但速度很快的存储器,CPU速度远远高于主内存的速度,所以从中读取数据需要等待很长的时间。所以把最常用的数据保存在缓存区中,再次读取该数据时,直接从缓存中读取,减少CPU等待的时间,从而提高系统性能
swap si 每秒从交换区写入内存的数据大小 表示数据由磁盘调入内存,这个数值越大,表明数据需要经常在磁盘和内存之间进行交换,系统性能越差
so 每秒从内存写入交换区的数据大小 表示数据由内存调入磁盘,数值大小影响系统的效用同 “si
io bi 每秒读取的块数 现在的Linux版本块的大小为1024bytes
bo 每秒写入的块数 如果 bi+bo 的值越大,则表示系统磁盘I/O越繁忙
system in 每秒中断数,包括时钟中断 这个值越大,表示系统与接口设备的通信越繁忙
cs 每秒上下文切换数 数值大小影响系统的效用同 “in
cpu us 用户进程消耗 CPU 运算时间的百分比 这个值比较高时,表示用户进程消耗的CPU时间多。如果长时间超过50%,那么我们就需要考虑优化程序算法或其他措施
sy 内核进程消耗 CPU 运算时间的百分比 这个值比较高时,表示系统内核消耗的CPU时间多,性能方面可能有一些问题,需要我们检查原因。一般来说"us+sy"应该小于80%
id 空闲 CPU 的百分比 如果这个值持续为0并且系统时间(cpu sy)是用户时间(cpu us)的两倍,系统则面临着CPU资源的短缺
wa 等待 I/O 所占用的 CPU 运算时间百分比 这个值比较高时,说明I/O等待比较严重,这可能是由于磁盘大量随机访问造成的,也有可能是磁盘的带宽出现瓶颈
st 虚拟 CPU 占用实际 CPU 运算时间的百分比 即虚拟机所占用的 CPU 运算时间百分比
  • 实例

  使用vmstat检测系统,每隔1秒刷新一次,共刷新3次,同时输出时间戳;

[root@localhost ~]# vmstat -t 1 3
procs -----------memory---------- ---swap-- -----io---- --system-- -----cpu------ ---timestamp---
 r  b   swpd   free   buff  cache   si   so    bi    bo   in   cs us sy id wa st
 1  0      0 764164  52540  54220    0    0    12     2   11   13  0  0 99  0  0        2020-04-20 13:58:29 CST
 0  0      0 764116  52540  54220    0    0     0     0   17   18  0  1 99  0  0        2020-04-20 13:58:30 CST
 0  0      0 764116  52540  54220    0    0     0     0   13   14  0  0 100  0  0       2020-04-20 13:58:31 CST

9、lsof命令

  • 命令解释
      lsof - list open files(列出打开的文件)
      通过 lsof 命令,可以根据文件找到对应的进程信息,也可以根据进程信息找到进程打开的文件。
  • 命令语法
      top [选项]
  • 命令常用选项
选 项 作  用
-c string 列出以 string 开头的进程打开的文件
-p pid 列出进程号为 PID 进程打开的文件
-u uname/uid 列出归属 uname/uid 的进程打开的文件
-g gname/gid 列出归属 gname/gid 的进程打开的文件
+d 目录 列出目录下所有被进程打开的文件
+D 目录 不但列出目录下的,同时也会搜索目录下的目录,时间较长
-d fd 列出文件描述符为 fd 的进程
-i [4,6] [protocol] [ @hostname|hostaddr ] [ :service|port ] 列出符合条件的进程
4,6 → IPV4 or IPV6
protocol → TCP or UDP
@hostname → Internet host name
hostaddr → IP地址
service → /etc/services中的service name
port → 端口号
  • lsof 命令执行结果各字段解释;
[root@localhost ~]# lsof    
COMMAND    PID      USER   FD      TYPE             DEVICE SIZE/OFF       NODE NAME
init         1      root  cwd       DIR                8,3     4096          2 /
init         1      root  rtd       DIR                8,3     4096          2 /
init         1      root  txt       REG                8,3   150352     653834 /sbin/init
init         1      root  mem       REG                8,3    65960     261170 /lib64/libnss_files-2.12.so
...省略部分信息

  下表对各字段的含义进行解释:

字 段 解 释
COMMAND 进程的名称
PID 进程标识符
USER 进程所有者
FD 文件描述符,应用程序通过文件描述符识别该文件。如cwd、txt等
TYPE 文件类型。如REG、DIR等
DEVICE 指定磁盘的名称
SIZE/OFF 文件的大小
NODE 索引节点
NAME 打开的文件确切名称
  • 实例

  ① 递归查看 /usr/bin 目录下所有打开的文件;

[root@localhost ~]# lsof +D /usr/lib
COMMAND  PID USER  FD   TYPE DEVICE SIZE/OFF   NODE NAME
crond   1732 root mem    REG    8,3 99164480 393263 /usr/lib/locale/locale-archive
bash    1823 root mem    REG    8,3 99164480 393263 /usr/lib/locale/locale-archive
bash    3007 root mem    REG    8,3 99164480 393263 /usr/lib/locale/locale-archive
lsof    3131 root mem    REG    8,3 99164480 393263 /usr/lib/locale/locale-archive
lsof    3132 root mem    REG    8,3 99164480 393263 /usr/lib/locale/locale-archive

  ② 查看某个文件被哪个进程调用;

[root@localhost ~]# lsof /sbin/init
COMMAND PID USER  FD   TYPE DEVICE SIZE/OFF   NODE NAME
init      1 root txt    REG    8,3   150352 653834 /sbin/init

  ③ 列出httpd服务的进程所打开的文件;

[root@localhost ~]# lsof -c httpd
COMMAND  PID   USER   FD   TYPE DEVICE SIZE/OFF   NODE NAME
httpd   3031   root  cwd    DIR    8,3     4096      2 /
httpd   3031   root  rtd    DIR    8,3     4096      2 /
httpd   3031   root  txt    REG    8,3  2163426 412492 /usr/local/httpd-2.4.41/bin/httpd
...省略部分信息

  ④ 列出使用特定的tcp端口的进程;

[root@localhost ~]# lsof -i tcp:80
COMMAND  PID   USER   FD   TYPE DEVICE SIZE/OFF NODE NAME
httpd   3031   root    4u  IPv6  22199      0t0  TCP *:http (LISTEN)
httpd   3032 daemon    4u  IPv6  22199      0t0  TCP *:http (LISTEN)
httpd   3033 daemon    4u  IPv6  22199      0t0  TCP *:http (LISTEN)
httpd   3034 daemon    4u  IPv6  22199      0t0  TCP *:http (LISTEN)

发布了16 篇原创文章 · 获赞 363 · 访问量 3万+

猜你喜欢

转载自blog.csdn.net/weixin_43898125/article/details/105481694