Centos系统进程管理
- 2019 年 11 月 12 日
- 筆記
1、什么是进程
进程是已启动的可执行程序的运行实例,进程有以下组成部分:
1.1 已分配内存的地址空间;
1.2 安全属性,包括所有权凭据和特权;
1.3 程序代码的一个或多个执行线程;
1.4 进程状态
程序: 二进制文件,静态 /bin/date, /usr/sbin/httpd,/usr/sbin/sshd, /usr/local/nginx/sbin/nginx 。
进程: 是程序运行的过程, 动态,有生命周期及运行状态。
2、进程的生命周期

描述如下:
父进程复制自己的地址空间(fork [fɔ:k] 分叉)创建一个新的(子)进程结构。每个新进程分配一个唯一的进程 ID (PID),满足跟踪安全性之需。PID 和 父进程 ID (PPID)是子进程环境的元素,任何进程都可以创建子进程,所有进程都是第一个系统进程的后代。
centos5或6PID为1的进程是:init
centos7 PID为1的进程是:systemd
僵尸进程:一个进程使用fork创建子进程,如果子进程退出,而父进程并没有调用wait或waitpid获取子进程的状态信息,那么子进程的进程描述符仍然保存在系统中。这种进程称之为僵尸进程。
用自己的话表达:父进程退出了,子进程没有退出, 那么这些子进程就没有父进程来管理了,就变成僵尸进程。
3、进程的属性
进程ID(PID):是唯一的数值,用来区分进程
父进程的ID(PPID)
启动进程的用户ID(UID)和所归属的组(GID)
进程状态:状态分为运行R、休眠S、僵尸Z
进程执行的优先级
进程所连接的终端名
进程资源占用:比如占用资源大小(内存、CPU占用量)
4、使用ps查看进程工具
4.1:常用的参数:
a: 显示跟当前终端关联的所有进程
u: 基于用户的格式显示(U: 显示某用户ID所有的进程)
x: 显示所有进程,不以终端机来区分
4.2常用的选项组合
[root@docker-01 ~]# ps -aux|more ##是用BSD的格式来显示进程 USER PID %CPU %MEM VSZ RSS TTY STAT START TIME COMMAND root 1 0.0 0.0 128148 6684? Ss 11月01 0:09 /usr/lib/syste md/systemd --switched-root--system--deserialize22 root 2 0.0 0.0 0 0? S 11月01 0:00 [kthreadd] root 3 0.0 0.0 0 0? S 11月01 0:00 [ksoftirqd/0] root 5 0.0 0.0 0 0? S< 11月01 0:00 [kworker/0:0H] root 6 0.0 0.0 0 0? S 11月01 0:00 [kworker/u8:0] root 7 0.0 0.0 0 0? S 11月01 0:00 [migration/0] root 8 0.0 0.0 0 0? S 11月01 0:00 [rcu_bh] root 9 0.0 0.0 0 0? S 11月01 0:12 [rcu_sched] root 10 0.0 0.0 0 0? S< 11月01 0:00 [lru-add-drain ##包含的信息如下 USER: 运行进程的用户 PID: 进程ID %CPU: CPU占用率 %MEM: 内存占用率 VSZ: 占用虚拟内存 RSS: 占用实际内存 驻留内存 TTY: 进程运行的终端 STAT: 进程状态 man ps(/STATE) R 运行 S 可中断睡眠 Sleep D 不可中断睡眠 T 停止的进程 Z 僵尸进程 X 死掉的进程 Ss s进程的领导者,父进程 S< <优先级较高的进程 SN N优先级较低的进程 R+ +表示是前台的进程组 Sl 以线程的方式运行 START: 进程的启动时间 TIME: 进程占用CPU的总时间 COMMAND:进程文件,进程名 [root@docker-01 ~]# ps -ef|head ##是用标准的格式显示进程 UID PID PPID C STIME TTY TIME CMD root 1 0 011月01 ? 00:00:09 /usr/lib/systemd/systemd --switched-root--system--deserialize22 root 2 0 011月01 ? 00:00:00 [kthreadd] root 3 2 011月01 ? 00:00:00 [ksoftirqd/0] root 5 2 011月01 ? 00:00:00 [kworker/0:0H] root 6 2 011月01 ? 00:00:00 [kworker/u8:0] root 7 2 011月01 ? 00:00:00 [migration/0] root 8 2 011月01 ? 00:00:00 [rcu_bh] root 9 2 011月01 ? 00:00:12 [rcu_sched] root 10 2 011月01 ? 00:00:00 [lru-add-drain] ##包含的信息如下 UID: 启动这些进程的用户 PID: 进程的ID PPID: 父进程的进程号 C: 进程生命周期中的CPU利用率 STIME: 进程启动时的系统时间 TTY: 表明进程在哪个终端设备上运行。如果显示 ?表示与终端无关,这种进程一般是内核态进程。另外, tty1-tty6 是本机上面的登入者程序,若为 pts/0 等,则表示运行在虚拟终端上的进程。 TIME: 运行进程一共累计占用的CPU时间 CMD: 启动的程序名称


4.3对进程的指定列进行排序
[root@docker-01 ~]# ps aux --sort %cpu |less ##升序排序 [root@docker-01 ~]# ps aux --sort -%cpu |less ##降序排序 [root@docker-01 ~]# ps aux --sort rss |less [root@docker-01 ~]# ps aux --sort -rss |less
4.4不可中断状态
[root@docker-01 ~]# tar -zcvf usr-tar.gz /usr/ ###然后在另一个终端不断查看状态,由S+,R+变为D+ [root@docker-01 ~]# ps -axu|grep tar root 25426 3.8 0.0 123688 1552pts/0 R+ 10:31 0:01 tar -zcvfusr-tar.gz /usr/ root 25447 0.0 0.0 112724 984pts/1 S+ 10:31 0:00 grep--color=auto tar root 25426 3.8 0.0 123688 1552pts/0 D+ 10:31 0:01 tar -zcvfusr-tar.gz /usr/ root 25447 0.0 0.0 112724 984pts/1 S+ 10:31 0:00 grep--color=auto tar
5、找出系统中使用CPU最多的进程
5.1运行top, 找出使用CPU最多的进程,按大写的P,可以按CPU使用率来排序显示
[root@docker-01 ~]# top top-10:48:16 up 1day, 18:41, 2users, load average: 0.00, 0.04, 0.08 Tasks: 111total, 2running, 109sleeping, 0stopped, 0zombie %Cpu(s): 0.1 us, 0.1 sy, 0.0 ni, 99.8 id, 0.0 wa, 0.0 hi, 0.0 si, 0.0 KiB Mem : 16266520total, 11269388free, 2162204used, 2834928buff/cache KiB Swap: 2097148total, 2097148free, 0used. 13687952avail Mem PID USER PR NI VIRT RES SHR S %CPU %MEM TIME+COMMAND 17427kibana 20 02515164 1.3g 10324S 0.7 8.3 9:05.29 node 17255elastic+ 20 04713976308280 15708S 0.3 1.9 11:09.30 java
5.2在linux系统中一个进程,最多可以使用100%cpu对吗?
[root@localhost ~]# top top-10:51:24 up 61days, 23:00, 2users, load average: 46.56, 48.38, 34.85 Tasks: 267total, 1running, 266sleeping, 0stopped, 0zombie Cpu(s): 96.9%us, 1.6%sy, 0.0%ni, 0.3%id, 0.0%wa, 0.5%hi, 0.5%si, 0.2%st Mem: 71545156k total, 71079896k used, 465260k free, 58836k buffers Swap: 2097148k total, 0k used, 2097148k free, 18012268k cached PID USER PR NI VIRT RES SHR S %CPU %MEM TIME+COMMAND 13073smgadmin 20 05451m 1.4g 21m S 130.5 2.0 184:57.92 java 30753smgadmin 20 04801m 1.3g 21m S 92.7 2.0 20:14.24 java ##可以看到java(脏牛漏洞,用于提权) 进程使用130.5%
注
如果你的4核心的cpu,你可以运行400%
6、Isof查看进程打开的文件,打开文件的进程,进程打开的端口(TCP、UDP)
[root@docker-01 ~]# yum install lsof [root@docker-01 ~]# vim a.txt [root@docker-01 ~]# ps -axu | grep a.txt root 25526 0.0 0.0 151532 5200pts/0 S+ 10:55 0:00 vima.txt root 25560 0.0 0.0 112724 1004pts/1 S+ 10:57 0:00 grep--color=auto a.txt [root@docker-01 ~]# lsof -p 25526 ##一般用于查看木马进程,在读哪些文件 [root@docker-01 ~]# lsof -i :22 ##用于查看端口,或查看黑客开启的后门端口是哪个进程在使用
7、进程优先级nice
7.1进程调度及多任务
每个CPU(或CPU核心)在一个时间点上只能处理一个进程,通过时间片技术,Linux实际能够运行的进程(和线程数)可以超出实际可用的CPU及核心数量。Linux内核进程调度程序将多个进程在CPU核心上快速切换,从而给用户多个进程在同时运行的印象。
7.2相对优先级 nice
由于不是每个进程都与其他进程同样重要,可告知进程调度程序为不同的进程使用不同的调度策略。常规系统上运行的大多数进程所使用的调度策略为 SCHED_OTHER (也称为SCHED_NORMAL),但还有其它一些调度策略用于不同的目的。
SCHED_OTHER 调度策略运行的进程的相对优先级称为进程的 nice 值,可以有40种不同级别的nice值。

nice 值越高:表示优先级越低,例如+19,该进程容易将CPU 使用量让给其他进程。nice 值越低:表示优先级越高,例如-20,该进程更不倾向于让出CPU。
7.3nice启动级别的设置
##启动进程时,通常会继承父进程的 nice级别,默认为0。 [root@docker-01 ~]# sleep 6000 & [1] 25601 [root@docker-01 ~]# ps axo command,pid,nice |grep sleep sleep6000 25601 0 grep--color=auto sleep 25603 0 ##指定启动级别为5 [root@docker-01 ~]# nice -n 5 sleep 6000 & [2] 25605 [1] 已杀死 sleep6000 [root@docker-01 ~]# ps axo command,pid,nice |grep sleep sleep6000 25605 5 grep--color=auto sleep 25607 0 ##更改现有进程的nice级别 25605(进程 ID) 旧优先级为 5,新优先级为 -15 [root@docker-01 ~]# ps axo command,pid,nice |grep sleep sleep6000 25605-15 grep--color=auto sleep 25611 0