第七章Linux系统管理 -Linux进程管理

第七章Linux系统管理

Linux进程管理

概述

进程是linux系统中正在运行的程序,服务则是系统启动后自动在后台运行的程序,合理地分配和调度系统的进程,配置管理系统所开启的服务,是保证系统稳定高效运行的关键。

当我们运行程序时,Linux会为程序创建一个特殊的环境,该环境包含程序运行需要的所有资源,以保证程序能够独立运行,不受其他程序的干扰。这个特殊的环境就称为进程。

系统中正在运行的程序叫进程,进程随人也是程序,但是和程序是有区别的。程序只占用磁盘空间,不占用系统运行资源,进程由程序产生,进程占用CPU和内存等系统资源。

6.1 进程的状态

进程在启动以后不一定马上开始运行,因而进程存在很多中状态。一般枪口下进程通常会在三种基本状态之间转换:运行,就绪,等待(阻塞)。

 

 

 

R (Running):该程序正在运行中;不止运行状态还有就绪状态。
S (Sleep):该程序目前正在睡眠状态(idle),但可以被唤醒(signal)。此类进程达到某种条件,就会变成就绪状态。
D :不可被唤醒的睡眠状态,通常这支程序可能在等待 I/O 的情况。比如某个进程,正在从硬盘向内存读入大量数据。

T :停止状态(stop),可能是在工作控制(背景暂停)或除错 (traced) 状态;
Z (Zombie):僵尸状态,程序已经终止但却无法被移除至内存外。当某个进程已经结束,但是父进程还没有释放其系统资源时,就会处于僵死状态。

 

 

6.2 进程的属性

在进程启动后,操作系统就会为每个进程分配一个唯一的进程标识符,称为进程ID(PID)。可以通过pidof命令就可以查询某个指定服务的进程PID。

PID是区分每个进程的唯一号码,systemd进程的PID固定为1。除此之外其他所有进程的PID都是不固定的。

[root@Redhat7 ~]# pidof sshd

2975 1159

进程通常有以下属性

1 父进程IP(PPID)

2 启动进程的用户ID(UID),和所属组的ID(GID)

3 进程状态

4 进程的执行优先级

5 进程所连接的终端名

6 进程资源占用:大小,如CPU,内存,硬盘等。

6.3 进程的分类

  按照功能可分为两种

1 系统进程:可以执行内存资源分配和进程切换等管理工作,这些进程的运行不受用户的干预,即使是root用户也不能干预进程的运行。

2 用户进程:通过执行用户程序,应用程序或内核之外的系统程序而产生的进程,此类进程可以在用户的控制下运行和关闭。

用户进程Linux系统进程共有三类:

(1)交互进程: 由一个shell终端启动的进程,在执行过程与用户进行交互操作,可以运行与前台或者后台。

(2)批处理进程: 该进程是一个进程集合,负责按顺序启动其他进程。

(3)守护进程:守护进程是一直运行的一种进程,经常在Linux系统启动时启动,在系统关闭时终止。它们独立与控制终端并且周期性的执行某种任务或等待处理某些发生的事件。例如httpd进程,一直处于运行状态,等待用户的访问。还有常用的crond进程,这个进程与windows的计划任务,可以周期性的执行用户设定的某些任务。

6.4进程的前台启动与后台启动

在linux系统中启动进程两个主要途径:手工启动和调度启动,调度启动是事先设置号在某个时间要运行的程序。

前台启动时默认的进程启动方式,如ls –l ,前台进程会将执行过程中产生的相关信息始终显示在终端上。如果在执行的命令后面加上一个&符号,此时进程将转到后台运行。

6.4.1 &后台启动命令

Netstat –ant | grep

[root@Redhat7 ~]# netstat -ant | grep :4444

4444 端口未开放

 

 

Nc –l –p –l是监听的意思,-p是端口。

 

光标一直运行4444 端口在listen

[root@Redhat7 ~]# netstat -ant | grep :4444

tcp        0      0 0.0.0.0:4444            0.0.0.0:*               LISTEN    

tcp6       0      0 :::4444                 :::*                    LISTEN

[root@Redhat7 ~]# nc -l -p 4444

^C

停止以后,

netstat -ant | grep :4444  马上停止工作

[root@Redhat7 ~]# netstat -ant | grep :4444

[root@Redhat7 ~]#

 

使用&转到后台运行

[root@Redhat7 ~]# nc -l -p 4444 &

[3] 6932

 

6.4.2 jobs(局限性-只能查看当前终端的后台命令)

[root@Redhat7 ~]# jobs

[1]   运行中               nc -l -p 6000 &

[2]-  运行中               nc -l -p 8000 &

[3]+  运行中               nc -l -p 4444 &

 

在别的终端无法查看

6.4.3 fg和bg(不好用)

fg N

将命令进程号码为N的命令进程放到前台执行,同%N

bg N

将命令进程号码为N的命令进程放到后台执行

 

[root@Redhat7 ~]# fg 1

nc -l -p 6000

 使用bg 要先ctrl +z

ctrl +z  停止运行

[root@Redhat7 ~]# nc -l -p 5444

^Z

[4]+  已停止               nc -l -p 5444

[root@Redhat7 ~]# jobs

[2]   运行中               nc -l -p 8000 &

[3]-  运行中               nc -l -p 4444 &

[4]+  已停止               nc -l -p 5444

 

[root@Redhat7 ~]# bg 4

[4]+ nc -l -p 5444 &

[root@Redhat7 ~]# jobs

[2]   运行中               nc -l -p 8000 &

[3]-  运行中               nc -l -p 4444 &

[4]+  运行中               nc -l -p 5444 &

 

6.4.4 进程与终端的关系nohup(完美解决

在终端1上面开启了后他运行的端口,如果关闭终端,后台运行的程序也自动结束了。父进程是45676,就是终端。

[root@Redhat7 ~]# ps -aux | grep nc

root       6731  0.0  0.1  45676  2080 pts/1    S    13:06   0:00 nc -l -p 8000

root       6932  0.0  0.1  45676  2080 pts/1    S    13:11   0:00 nc -l -p 4444

root       7582  0.0  0.1  45676  2080 pts/1    S    13:51   0:00 nc -l -p 5444

 

nohup 命令运行由 Command参数和任何相关的 Arg参数指定的命令,忽略所有挂断(SIGHUP)信号。在注销后使用 nohup 命令运行后台中的程序。要运行后台中的 nohup 命令,添加 & ( 表示“and”的符号)到命令的尾部。

 

nohup Command [ Arg ... ] [ & ]

 

 

[root@Redhat7 ~]# nohup  nc -l -p 5444 &

[2] 7967

 

关闭终端以后,还是存在

root       7954  0.0  0.1  45676  2080 ?        S    14:02   0:00 nc -l -p 5444

 

6.5 PS命令

ps(process status) 命令是LINUX下最常用的进程查看工具,使用该命令可以确定有哪些进程正在运行和运行的状态、进程是否结束、进程有没有僵尸、哪些进程占用了过多的资源等等。ps命令最常用的是用于监控后台进程的工作情况,因为后台进程是不和屏幕键盘这些标准输入/输出设备进行通信的,所以如果需要查看某个后台进程的具体情况,可以使用PS命令,总之大部分信息都是可以通过执行该命令得到的。

linux上进程有5种状态:

运行(正在运行或在运行队列中等待)

中断(休眠中, 受阻, 在等待某个条件的形成或接受到信号)

不可中断(收到信号不唤醒和不可运行, 进程必须等待直到有中断发生)

僵死(进程已终止, 但进程描述符存在, 直到父进程调用wait4()系统调用后释放)

停止(进程收到SIGSTOP, SIGSTP, SIGTIN, SIGTOU信号后停止运行运行)

ps工具标识进程的5种状态码:

R 运行 runnable (on run queue)

S 中断 sleeping

D 不可中断 uninterruptible sleep (usually IO)

T 停止 traced or stopped

Z 僵死 a defunct (”zombie”) process

6.5.1 PS参数

-A 显示所有进程(等价于-e)(utility)

-a 显示一个终端的所有进程,除了会话引线

-N 忽略选择。

-d 显示所有进程,但省略所有的会话引线(utility)

-x 显示没有控制终端的进程,同时显示各个命令的具体路径。dx不可合用。(utility)

-p pid 进程使用cpu的时间

-u uid or username 选择有效的用户id或者是用户名

-g gid or groupname 显示组的所有进程。

U username 显示该用户下的所有进程,且显示各个命令的详细路径。如:ps U zhang;(utility)

-f 全部列出,通常和其他选项联用。如:ps -fa or ps -fx and so on.

-l 长格式(有F,wchan,C 等字段)

-j 作业格式

-o 用户自定义格式。

v 以虚拟存储器格式显示

s 以信号格式显示

-m 显示所有的线程

-H 显示进程的层次(和其它的命令合用,如:ps -Ha)(utility)

e 命令之后显示环境(如:ps -d e; ps -a e)(utility)

h 不显示第一行
 

6.5.2 ps aux(不用加—,看不到父进程)

最常用的方法是ps -aux,然后再利用一个管道符号导向到grep去查找特定的进程,然后再对特定的进程进行操作。

 

 

 

 

[root@Redhat7 ~]# ps -aux | grep sshd

root       1159  0.0  0.1  82544  3596 ?        Ss   17:13   0:00 /usr/sbin/sshd –D

 

USER:    用户名

PID:    进程ID(Process ID)

%CPU:    进程的cpu占用率

%MEM:    进程的内存占用率

VSZ:    进程所使用的虚存的大小(Virtual Size)

RSS:    进程使用的驻留集大小或者是实际内存的大小,Kbytes字节。

TTY:    与进程关联的终端(tty)

STAT:    进程的状态:进程状态使用字符表示的(STAT的状态码)

TIME:    进程使用的总cpu时间

COMMAND:    正在执行的命令行命令

 

6.5.3 ps ef(不用加—,可以看到父进程)

 

[root@Redhat7 ~]# ps -ef

UID         PID   PPID  C STIME TTY          TIME CMD

root          1      0  0 17:13 ?        00:00:01 /usr/lib/systemd/systemd --swi

root          2      0  0 17:13 ?        00:00:00 [kthreadd]

root          3      2  0 17:13 ?        00:00:00 [ksoftirqd/0]

root          5      2  0 17:13 ?        00:00:00 [kworker/0:0H]

 

 

 UID: 用户ID(User ID)

PID: 进程ID(Process ID)

PPID: 父进程的进程ID(Parent Process id)

STIME: 启动时间

TTY: 与进程关联的终端(tty)

TIME: 进程使用的总cpu时间

CMD: 正在执行的命令行命令

 

6.6 TOP命令

top命令是Linux下常用的性能分析工具,能够实时显示系统中各个进程的资源占用状况,类似于Windows的任务管理器。

top显示系统当前的进程和其他状况,是一个动态显示过程,即可以通过用户按键来不断刷新当前状态.如果在前台执行该命令,它将独占前台,直到用户终止该程序为止. 比较准确的说,top命令提供了实时的对系统处理器的状态监视.它将显示系统中CPU最“敏感”的任务列表.该命令可以按CPU使用.内存使用和执行时间对任务进行排序;而且该命令的很多特性都可以通过交互式命令或者在个人定制文件中进行设定. 

6.6.1 top命令格式详解

 [root@Redhat7 ~]# top

1行  top - 10:55:45 up  1:22,  2 users,  load average: 0.00, 0.01, 0.05

2行  Tasks: 456 total,   1 running, 455 sleeping,   0 stopped,   0 zombie

3 行 %Cpu(s):  0.0 us,  0.0 sy,  0.0 ni,100.0 id,  0.0 wa,  0.0 hi,  0.0 si,  0.0 st

4 行KiB Mem :  1868688 total,  1188572 free,   300196 used,   379920 buff/cache

5行 KiB Swap:  2097148 total,  2097148 free,        0 used.  1382752 avail Mem

第一行含义

第一行是任务队列信息,同 uptime 命令的执行结果。其内容如下:

10:55:45 当前时间

up 1:22 系统运行时间,格式为时:分

2 user 当前登录用户数

load average: 0.00, 0.01, 0.05系统负载,即任务队列的平均长度。三个数值分别为 1分钟、5分钟、15分钟前到现在的平均值。

第二、三行为进程和CPU的信息

 Tasks: 456total 进程总数

1 running 正在运行的进程数

455 sleeping 睡眠的进程数

0 stopped 停止的进程数

0 zombie 僵尸进程数

Cpu(s): 0.0% us 用户空间占用CPU百分比

0.0% sy 内核空间占用CPU百分比

0.0% ni 用户进程空间内改变过优先级的进程占用CPU百分比

100.0% id 空闲CPU百分比

0.0% wa 等待输入输出的CPU时间百分比

0.0% hi

0.0% si

第四行和第五行内存信息

4 行KiB Mem :  1868688 total,  1188572 free,   300196 used,   379920 buff/cache

5行 KiB Swap:  2097148 total,  2097148 free,        0 used.  1382752 avail Mem

 

内容                          含义

KiB Mem :  1868688 total     物理内存总量

1188572 free                      空闲内存总量

300196 used                   使用的物理内存总量

379920 buff/cache           用作内核缓存的内存量

 

KiB Swap:  2097148 total         交换区总量

2097148 free,                     空闲交换区总量

0 used                           使用的交换区总量

1382752 avail Mem                 代表可用于进程下一次分配的物理内存数量

6.6.2 输出列格式详解

PID — 进程id
USER — 进程所有者
PR — 进程优先级
NI — nice值。负值表示高优先级,正值表示低优先级
VIRT — 进程使用的虚拟内存总量,单位kb。VIRT=SWAP+RES
RES — 进程使用的、未被换出的物理内存大小,单位kb。RES=CODE+DATA
SHR — 共享内存大小,单位kb
S —进程状态。D=不可中断的睡眠状态 R=运行 S=睡眠 T=跟踪/停止 Z=僵尸进程
%CPU — 上次更新到现在的CPU时间占用百分比
%MEM — 进程使用的物理内存百分比
TIME+ — 进程使用的CPU时间总计,单位1/100秒
COMMAND — 进程名称(命令名/命令行)

6.6.3 top使用技巧

第一个主要看100.0 id空闲有多少,如果空闲太小,看看是用户的,还是系统的0.0 us(用户),  0.0 sy(系统)。

第二个主要看,KiB Mem :  1868688 total,  1187900 free,   300940 used,   379848 buff/cache。。主要看1187900 free是否有剩余。

按大写的P以CPU排序,按大写的M以内存排序。

6.7 终止进程kill

Ctrl+c 终止进程。

Linux kill 命令很容易让人产生误解,以为它仅仅就是用来杀死进程的。我们来看一下 man page 对它的解释:kill - send a signal to a process.

从官方的解释不难看出,kill 是向进程发送信号的命令。当然我们可以向进程发送一个终止运行的信号,此时的 kill 命令才是名至实归。事实上如果我们不给 kill 命令传递信号参数,它默认传递终止进程运行的信号给进程!这是 kill 命令最主要的用法,也是本文要介绍的内容。

 

kill 命令是用来向进程发送信号的,那就让我们先来看看都有哪些信号可以发送给进程

[root@Redhat7 ~]# kill -l

 1) SIGHUP       2) SIGINT       3) SIGQUIT      4) SIGILL       5) SIGTRAP

 6) SIGABRT      7) SIGBUS       8) SIGFPE       9) SIGKILL     10) SIGUSR1

11) SIGSEGV     12) SIGUSR2     13) SIGPIPE     14) SIGALRM     15) SIGTERM

16) SIGSTKFLT   17) SIGCHLD     18) SIGCONT     19) SIGSTOP     20) SIGTSTP

21) SIGTTIN     22) SIGTTOU     23) SIGURG      24) SIGXCPU     25) SIGXFSZ

26) SIGVTALRM   27) SIGPROF     28) SIGWINCH    29) SIGIO       30) SIGPWR

31) SIGSYS      34) SIGRTMIN    35) SIGRTMIN+1  36) SIGRTMIN+2  37) SIGRTMIN+3

38) SIGRTMIN+4  39) SIGRTMIN+5  40) SIGRTMIN+6  41) SIGRTMIN+7  42) SIGRTMIN+8

43) SIGRTMIN+9  44) SIGRTMIN+10 45) SIGRTMIN+11 46) SIGRTMIN+12 47) SIGRTMIN+13

48) SIGRTMIN+14 49) SIGRTMIN+15 50) SIGRTMAX-14 51) SIGRTMAX-13 52) SIGRTMAX-12

53) SIGRTMAX-11 54) SIGRTMAX-10 55) SIGRTMAX-9  56) SIGRTMAX-8  57) SIGRTMAX-7

58) SIGRTMAX-6  59) SIGRTMAX-5  60) SIGRTMAX-4  61) SIGRTMAX-3  62) SIGRTMAX-2

63) SIGRTMAX-1  64) SIGRTMAX

6.7.1 强制终止进程kill -9 pid

[root@Redhat7 ~]# nohup  nc -l -p 5444 &

[root@Redhat7 ~]# ps -aux | grep nc

root       7954  0.0  0.1  45676  2080 ?        S    15:22   0:00 nc -l -p 5444

[root@Redhat7 ~]# netstat -ant | grep :5444

tcp        0      0 0.0.0.0:5444            0.0.0.0:*               LISTEN    

tcp6       0      0 :::5444                 :::*                    LISTEN

[root@Redhat7 ~]# kill -9 7954

[root@Redhat7 ~]# netstat -ant | grep :5444

[root@Redhat7 ~]# ps -aux | grep nc

 

6.7.2 kill与kill -9 区别

kill和kill -9,两个命令在linux中都有杀死进程的效果,然而两命令的执行过程却大有不同,在程序中如果用错了,可能会造成莫名其妙的现象。

执行kill(不加 -* 默认kill -15)命令,系统会发送一个SIGTERM信号给对应的程序。当程序接收到该signal信号后,将会发生以下事情:

1程序立刻停止

2当程序释放相应资源后再停止

3程序可能仍然继续运行

4大部分程序接收到SIGTERM信号后,会先释放自己的资源,然后再停止。但是也有程序可能接收信号后,做一些其他的事情(如果程序正在等待IO,可能就不会立马做出响应,我在使用wkhtmltopdf转pdf的项目中遇到这现象),也就是说,SIGTERM多半是会被阻塞的。

5 然而kill -9命令,系统给对应程序发送的信号是SIGKILL,即exit。exit信号不会被系统阻塞,所以kill -9能顺利杀掉进程。

6.8 killall

Kill all杀掉一组程序的所有进程。

[root@Redhat7 ~]# pidof sshd

8193 7871 1151

使用SSHD有三个进程,可以使用killall sshd全部删除

6.9 显示系统用户信息

6.9.1 监视用户 who

[root@Redhat7 ~]# who

(unknown) :0           2019-08-25 19:13 (:0) :0本地地址

root     pts/0        2019-08-25 19:15 (192.168.27.2)

root     pts/1        2019-08-25 19:20 (192.168.27.2)

 

6.9.2 监视用户w,最后显示命令

[root@Redhat7 ~]# w

 19:26:29 up 13 min,  3 users,  load average: 0.00, 0.04, 0.07

USER     TTY      FROM             LOGIN@   IDLE   JCPU   PCPU WHAT

root     pts/0    192.168.27.2     19:15    7:17   0.03s  0.03s -bash

root     pts/1    192.168.27.2     19:20    5.00s  0.01s  0.00s w

 

6.9.3 last

last [-num | -n num] [-f file] [-t YYYYMMDDHHMMSS] [-R] [-adioxFw] [username..] [tty..]

  last作用是显示近期用户或终端的登录情况。通过last命令查看该程序的log,管理员可以获知谁曾经或者企图连接系统。

  执行last命令时,它会读取/var/log目录下名称为wtmp的文件,并把该文件记录的登录系统或终端的用户名单全部显示出来。默认显示wtmp的记录,btmp能显示的更详细,可以显示远程登录,例如ssh登录。

1

2

3

4

-num |-n num指定输出记录的条数

-f file 指定记录文件作为查询的log文件

-t YYYYMMDDHHMMSS 显示指定时间之前的登录情况

username 账户名称<br>tty 终端机编号

 

 

[root@Redhat7 ~]# last

root     pts/1        192.168.27.2     Sun Aug 25 19:20   still logged in  

root     pts/0        192.168.27.2     Sun Aug 25 19:15   still logged in  

(unknown :0           :0               Sun Aug 25 19:13   still logged in  

reboot   system boot  3.10.0-327.el7.x Mon Aug 26 03:05 - 19:32  (-7:-33)  

root     pts/1        192.168.27.2     Sun Aug 25 16:03 - down   (00:24)   

root     pts/0        :0               Sun Aug 25 16:02 - 16:28  (00:25)

 

显示最后10条,20190718以前登录的用户

[root@Redhat7 ~]# last -10 -t 20190718000000

root     pts/0        192.168.27.2     Wed Jul 17 19:52    gone - no logout

(unknown :0           :0               Wed Jul 17 19:37    gone - no logout

root     pts/0        :0               Tue Jul 16 23:43 - 23:43  (00:00)   

root     pts/2        :0               Tue Jul 16 23:03 - 23:03  (00:00)   

root     pts/1        192.168.27.2     Tue Jul 16 23:01 - 23:37  (00:35)   

root     pts/0        192.168.27.2     Tue Jul 16 22:56 - 23:37  (00:41)   

root     :0           :0               Tue Jul 16 22:55 - 23:43  (00:48)   

(unknown :0           :0               Tue Jul 16 22:54 - 22:55  (00:00)   

reboot   system boot  3.10.0-327.el7.x Wed Jul 17 06:47 - 23:43  (-7:-3)   

root     pts/0        192.168.27.2     Tue Jul 16 22:44 - down   (00:10)   

6.10 监视系统资源占用情况

[root@Redhat7 ~]# uptime

 19:52:23 up 39 min,  2 users,  load average: 0.00, 0.01, 0.05

Updatime  运行39分钟,2个用户,平均负责5分钟010分钟0.0115分钟0.05.。如果三个数大于CPU核数,有相当严重问题。

 

 

[root@Redhat7 ~]# free -h

              total        used        free      shared  buff/cache   available

Mem:           1.8G        270M        1.2G        9.0M        334M        1.4G

Swap:          2.0G          0B        2.0G

 

如果SWAP有使用内存,就证明,内存不足,因为硬盘作为虚拟内存使用本事就是不合适的。内存使用不均衡,可能是瞬时很大,并不是available有多少。

 

-s 10 动态运行10秒更新。

[root@Redhat7 ~]# free -h -s 10

              total        used        free      shared  buff/cache   available

Mem:           1.8G        271M        1.2G        9.0M        334M        1.4G

Swap:          2.0G          0B        2.0G

发布了37 篇原创文章 · 获赞 0 · 访问量 2407

猜你喜欢

转载自blog.csdn.net/syjhct/article/details/100164544
今日推荐