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
关于运维学习、分享、交流,笔者开通了微信公众号【运维猫】,感兴趣的朋友可以关注下,欢迎加入,建立属于我们自己的小圈子,一起学运维知识。
有需要技术交流的小伙伴可以加我微信,期待与大家共同成长,本人微信:
最近有一些星友咨询我知识星球的事,我也想继续在星球上发布更优质的内容供大家学习和探讨。运维猫公众号平台致力于为大家提供免费的学习资源。知识星球主要针对于在这方便工作、对运维特别感兴趣、想往运维方面发展的小伙伴。大家可以加入星球,一起探讨工作中的疑惑、技术上的难题、以及未来的发展趋势。
为了保证星球的质量,知识星球每周会发表两篇文章(周三和周末)。
知识星球会不定期的为大家提供更优惠或者免费运维峰会门票的福利。