一、什么是进程
进程是加载到内存中的一段指令。如果某个用户运行一个程序,那么这个程序产生的进程也会继承到这个用户的UID和GID以及SELINUX的上下文,并且进程还具有父子关系,一个父进程可以有多个子进程
二、查看进程
2.1 ps查看进程信息
用法 | 作用 |
ps | 查看当前终端的进程 |
ps -a | 查看所有终端的进程 |
ps -au | 查看所有终端的进程并显示用户、cpu和内存使用率等信息 |
ps -ax | 查看所有的进程包括没有终端的进程 |
ps -aux | 查看所有进程的详细信息(常用) |
ps -ef | 查看所有进程的详细信息(常用) |
ps -axo user,pid,%cpu,stat,command | 按照指定的格式“user,pid,%cpu,stat,command”输出 |
ps -aux --sort=%cpu | 查看所有进程的详细信息,按照cpu使用率从小到大排序 |
ps -aux --sort=-%cpu | 查看所有进程的详细信息,按照cpu使用率从大到小排序 |
ps -aux --sort=%mem | 查看所有进程的详细信息,按照内存使用率从小到大排序 |
ps -aux --sort=-%mem | 查看所有进程的详细信息,按照内存使用率从大到小排序 |
2.2 ps -aux执行结果说明
TTY:表示的是终端,如果进程的这一栏显示的是:
- pts:是虚拟伪终端(一般ssh登录以及图形化
- tty2:表示当前有桌面环境
- ?:表示该进程没有终端,一般是内核进程
STAT:进阶状态补充
- D 不可中断睡眠(通常是在IO操作)收到信号不唤醒和不可运行,进程必须等待直到有中断发生
- R 正在运行或可运行(在运行队列排队中)
- S 可中断睡眠(休眠中,受阻,在等待某个条件的形成或接受到信号)
- T 已停止的进程收到SIGSTOP, SIGSTP, SIGTIN, SIGT0瞧号后停止运行
- W 正在换页(2.6.内核之前有效)
- X 死进程(未开启)
- Z 僵尸进程 进程已终止,但进程描述符存在,直到父进程调用wait4()系统调用后释放BSD风格的
- < 高优先级(not nice to other users)
- N 低优先级(nice to other users)
- L 页面锁定在内存(实时和定制的IO)
- s 一个信息头
- | 多线程(使用CLONE_THREAD,像NPTL的pthreads的那样)
- + 在前台进程组
2.3 top查看进程信息
常用选项 | 作用 |
-a | 按内存使用情况排序 |
-d | 设置显示的刷新速度(默认为3秒) |
-n | 设置显示的总次数,完成后自动退出 |
-p | 仅显示指定进程ID |
-u | 仅显示指定用户运行的进程 |
2.3.1 top执行结果说明
第一行:
执行uptime命令可以得到与top命令第一行一样的结果
[root@node1 ~]# uptime
12:40:00 up 1:17, 2 users, load average: 0.02, 0.02, 0.00
第二行:
第三行:
第四行:
第五行:
进程信息:
进程信息:
在top命令中按F
键可以查看显示的列信息,按对应字母来开启/关闭列,大写字母表示开启,小写字母表示关闭。带*
号的是默认列。
- PID = (Process Id) 进程Id;
- USER = (User Name) 进程所有者的用户名;
- PR = (Priority) 优先级
- NI = (Nice value) nice值。负值表示高优先级,正值表示低优先级
- VIRT = (Virtual Image (kb)) 进程使用的虚拟内存总量,单位kb。VIRT=SWAP+RES
- RES = (Resident size (kb)) 进程使用的、未被换出的物理内存大小,单位kb。RES=CODE+DATA
- SHR = (Shared Mem size (kb)) 共享内存大小,单位kb
- S = (Process Status) 进程状态。D=不可中断的睡眠状态,R=运行,S=睡眠,T=跟踪/停止,Z=僵尸进程
- %CPU = (CPU usage) 上次更新到现在的CPU时间占用百分比
- %MEM = (Memory usage (RES)) 进程使用的物理内存百分比
- TIME+ = (CPU Time, hundredths) 进程使用的CPU时间总计,单位1/100秒
- PPID = (Parent Process Pid) 父进程Id
- RUSER = (Real user name)
- UID = (User Id) 进程所有者的用户id
- GROUP = (Group Name) 进程所有者的组名
- TTY = (Controlling Tty) 启动进程的终端名。不是从终端启动的进程则显示为 ?
- P = (Last used cpu (SMP)) 最后使用的CPU,仅在多CPU环境下有意义
- SWAP = (Swapped size (kb)) 进程使用的虚拟内存中,被换出的大小,单位kb
- TIME = (CPU Time) 进程使用的CPU时间总计,单位秒
- CODE = (Code size (kb)) 可执行代码占用的物理内存大小,单位kb
- DATA = (Data+Stack size (kb)) 可执行代码以外的部分(数据段+栈)占用的物理内存大小,单位kb
- nFLT = (Page Fault count) 页面错误次数
- nDRT = (Dirty Pages count) 最后一次写入到现在,被修改过的页面数
- WCHAN = (Sleeping in Function) 若该进程在睡眠,则显示睡眠中的系统函数名
- Flags = (Task Flags <sched.h>) 任务标志,参考 sched.h
- COMMAND = (Command name/line) 命令名/命令行
top命令执行过程中还可以使用的一些交互命令,例如:
- 数字
1
:监控每个逻辑CPU的状况 c
:切换显示命令名称和完整命令行M
:可按内存占用情况进行排序P
:根据CPU使用百分比大小进行排序T
:根据时间/累积时间进行排序F
:选择显示的内容
2.4 pgrep与pidof
pgrep
和pidof
都是通过进程名称查找进程id的命令,两者的区别在于:pgrep
只要进程的名称里面含有查找的关键字就会把它列出来,属于模糊查询,而pidof
必须要进程的名称与查找的关键字完全一致才会列出pid,属于精确查询,下面是pgrep
命令的常用选项:
pgrep命令常用选项 | |
选项 | 作用 |
-U | 查找某个用户的进程id |
-G | 查找某个组的进程id |
-P | 根据父进程id,查找出所有子进程id |
-I | 不仅打印pid,也打印进程名 |
-o | 表示如果该程序有多个进程正在运行,则仅查找最老的,即最先启动的(多个进程时即父进程PID) |
-n | 表示如果该程序有多个进程正在运行,则仅查找最新的,即最后启动的 |
-d | 定义多个进程之间的分隔符,如果不定义则使用换行符 |
三、僵尸(zombie)进程与孤儿进程
僵尸进程:
如上图所示,操作系统下父进程在运行时产生了一个子进程,用于执行某些任务,执行完成以后需要把结果汇报给父进程,再由父进程结束子进程, 然而子进程在汇报结果时父进程因为某些原因卡住了,由于子进程没有收到父进程的响应,子进程就不断地重复这一步骤,这种情况下,这个子进程就成为了一个僵尸进程,僵尸进程对系统是有危害的,大量消耗系统的CPU和内存资源,需要人为的手动结束进程
孤儿进程:
如上两张图所示,操作系统下父进程在运行时产生了一个子进程,父进程结束了,而它的一个或多个子进程还在运行,那么这些子进程就成为孤儿进程(father died)。孤儿进程会被PID为1的进程自动接管,RHEL 7以前是init,RHEL 7以后是systemd,由PID为1的进程来结束孤儿进程。
四、结束进程
在Linux中进程通信的方式有:信号、套接字、有名管道、消息队列、共享内存等等...
其中最常见的通信方式有信号和套接字,以套接字(sock)为例,例如在Zabbix 4.0中,Zabbix-server服务端访问Mariadb数据库方式就是通过sock文件访问的,不一定是通过开放网络端口,这是基于数据安全考虑的一种做法
在Linux中默认使用信号来进行进程的通信,每个进程在收到信号之前,都是先运行自己的代码,收到信号以后,优先处理信号
4.1 kill命令给进程发送信号
在Linux中kill
命令常用于结束进程,其实严格意义上来讲它是一个手动给进程发送信号的工具
通过kill -l
命令,可以查看到kill命令可以给进程发送64种信号
其中最常用的信号有三个,分别是“-1
”、“-15
”和“-9
”
信号 | 作用 |
-1 | Signal 1: HUP - 重读配置文件 |
-15 | Signal 15: TERM - 结束进程(默认) |
-9 | Signal 9: KILL - 强制结束进程(生产环境慎用,很有可能造成数据丢失) |
其实我们在CLI命令行窗口执行命令的时候经常使用的快捷键“Ctrl + C”也是一个给进程发送Signal 15的途径
4.2 killall命令
killall
命令与kill
命令一样,都可以用于结束进程 ,不同之处在于:killall可以批量结束一类进程(根据名字结束进程)
示例:
使用vim编辑器同时编辑三个文件
[root@node1 ~]# vim 111.txt
[root@node1 ~]# vim 222.txt
[root@node1 ~]# vim 333.txt
查看vim相关进程
[root@node1 ~]# pgrep -l vim
5201 vim
5202 vim
5203 vim
批量结束vim进程
[root@node1 ~]# killall vim
[root@node1 ~]# pgrep -l vim
[root@node1 ~]#
4.3 pkill结束终端进程
pkill命令用于结束一个终端(通常是ssh的pts)的进程,使用-t
选项,后面接的是终端名称
示例:
首先,使用ssh方式登录一个用户
然后,在本机的命令行终端结束这个ssh终端进程
ssh连接断开
需要注意的是:在ssh远程用户的终端中,是不能结束这个终端本身的进程的
但是,在Linux本机的终端中,用户可以结束自己当前所使用的终端
五、调整进程的静态优先级(NICE)
调整进行的优先级,在系统繁忙时能够保证优先级高的进程的被分配到CPU资源
PR:动态优先级,由内核负责调整
NI:静态优先级,由用户负责调整
nice
值取值范围:(-20
- 19
),nice值越低,优先级越高
nice值只有root可以降低(root才可以调整进程的优先级)
示例:
Case1:在进程启动时指定优先级
[root@node1 ~]# nice -n -20 vim manual.txt
[root@node1 ~]# ps -axo user,pid,ppid,nice,command | grep vim
root 6498 6439 -20 vim manual.txt
root 6500 6211 0 grep --color=auto vim
Case2:调整正在运行的进程优先级
[root@node1 ~]# systemctl status httpd
● httpd.service - The Apache HTTP Server
Loaded: loaded (/usr/lib/systemd/system/httpd.service; disabled; vendor preset: disabled)
Active: active (running) since Sat 2024-01-13 15:58:58 CST; 45s ago
Docs: man:httpd.service(8)
Main PID: 6570 (httpd)
Status: "Running, listening on: port 80"
Tasks: 213 (limit: 24436)
Memory: 33.7M
CGroup: /system.slice/httpd.service
├─6570 /usr/sbin/httpd -DFOREGROUND
├─6571 /usr/sbin/httpd -DFOREGROUND
├─6572 /usr/sbin/httpd -DFOREGROUND
├─6573 /usr/sbin/httpd -DFOREGROUND
└─6574 /usr/sbin/httpd -DFOREGROUND
Jan 13 15:58:57 node1.example.com systemd[1]: Starting The Apache HTTP Server...
Jan 13 15:58:58 node1.example.com httpd[6570]: AH00558: httpd: Could not reliably determine the server's fully qualified domain name, using node1.example.com. Set the 'ServerName' directive globally to suppress this message
Jan 13 15:58:58 node1.example.com systemd[1]: Started The Apache HTTP Server.
Jan 13 15:58:58 node1.example.com httpd[6570]: Server configured, listening on: port 80
[root@node1 ~]#
[root@node1 ~]# renice -n -10 -p 6570
6570 (process ID) old priority 0, new priority -10
[root@node1 ~]# ps -axo user,pid,ppid,nice,command | grep httpd
root 6570 1 -10 /usr/sbin/httpd -DFOREGROUND
apache 6571 6570 0 /usr/sbin/httpd -DFOREGROUND
apache 6572 6570 0 /usr/sbin/httpd -DFOREGROUND
apache 6573 6570 0 /usr/sbin/httpd -DFOREGROUND
apache 6574 6570 0 /usr/sbin/httpd -DFOREGROUND
root 6809 6211 0 grep --color=auto httpd
六、作业控制(job control)
- 在后台运行一个进程:
给命令的最后附加一个&
符号 - 临时停止一个正在运行的进程:
使用快捷键Ctrl + Z
或者发送signal 19(停止) - 管理后台或者挂起的作业
显示作业号和名字:jobs
在后台恢复:bg [%jobnum]
在前台恢复:fg [%jobnum]
发送一个信号:kill [-SIGNAL] [%jobnum]
示例:
Case1:在后台运行一个进程
[root@node1 ~]# wget https://mirrors.ustc.edu.cn/rocky/8.9/isos/x86_64/Rocky-8-latest-x86_64-minimal.iso &
[1] 7135
[root@node1 ~]#
Redirecting output to ‘wget-log’. # wget自动重定向输出到文件“wget-log”
[root@node1 ~]# jobs # 显示作业号和名字
[1]+ Running wget https://mirrors.ustc.edu.cn/rocky/8.9/isos/x86_64/Rocky-8-latest-x86_64-minimal.iso &
[root@node1 ~]#
[root@node1 ~]# tail -f wget-log # 实时查看“wget-log”日志
--2024-01-13 16:23:13-- https://mirrors.ustc.edu.cn/rocky/8.9/isos/x86_64/Rocky-8-latest-x86_64-minimal.iso
Resolving mirrors.ustc.edu.cn (mirrors.ustc.edu.cn)... 218.104.71.170, 2001:da8:d800:95::110
Connecting to mirrors.ustc.edu.cn (mirrors.ustc.edu.cn)|218.104.71.170|:443... connected.
HTTP request sent, awaiting response... 200 OK
Length: 2516582400 (2.3G) [application/octet-stream]
Saving to: ‘Rocky-8-latest-x86_64-minimal.iso’
Rocky-8-latest-x86_64-minimal.iso 59%[=====================================================================================> ] 1.39G 32.6MB/s eta 31s ^C
[root@node1 ~]#
[root@node1 ~]#
[root@node1 ~]# jobs # 显示作业号和名字
[1]+ Done wget https://mirrors.ustc.edu.cn/rocky/8.9/isos/x86_64/Rocky-8-latest-x86_64-minimal.iso
[root@node1 ~]#
[root@node1 ~]# ls -l Rocky-8-latest-x86_64-minimal.iso
-rw-r--r--. 1 root root 2516582400 Nov 22 03:05 Rocky-8-latest-x86_64-minimal.iso
[root@node1 ~]#
[root@node1 ~]# cat wget-log
--2024-01-13 16:23:13-- https://mirrors.ustc.edu.cn/rocky/8.9/isos/x86_64/Rocky-8-latest-x86_64-minimal.iso
Resolving mirrors.ustc.edu.cn (mirrors.ustc.edu.cn)... 218.104.71.170, 2001:da8:d800:95::110
Connecting to mirrors.ustc.edu.cn (mirrors.ustc.edu.cn)|218.104.71.170|:443... connected.
HTTP request sent, awaiting response... 200 OK
Length: 2516582400 (2.3G) [application/octet-stream]
Saving to: ‘Rocky-8-latest-x86_64-minimal.iso’
Rocky-8-latest-x86_64-minimal.iso 100%[=================================================================================================================================================>] 2.34G 34.5MB/s in 74s
2024-01-13 16:24:27 (32.5 MB/s) - ‘Rocky-8-latest-x86_64-minimal.iso’ saved [2516582400/2516582400]
[root@node1 ~]#
Case2:临时停止一个正在运行的进程
[root@node1 ~]# vim README
======================
按快捷键“Ctrl + Z”
======================
[1]+ Stopped vim README
[root@node1 ~]#
[root@node1 ~]# ps -aux | grep vim
root 7247 0.0 0.2 245844 8460 pts/1 T 16:34 0:00 vim README
root 7270 0.0 0.0 221940 1112 pts/0 S+ 16:36 0:00 grep --color=auto vim
[root@node1 ~]#
[root@node1 ~]# jobs # 显示作业号和名字
[1]+ Stopped vim README
[root@node1 ~]# bg %1 # 后台恢复
[1]+ vim README &
[root@node1 ~]#
[1]+ Stopped vim README # vim程序无法后台运行,在后台运行的一瞬间立刻暂停
[root@node1 ~]# jobs
[1]+ Stopped vim README
[root@node1 ~]# fg %1 # 恢复到前台运行
vim README # 进入vim编辑视图
======================
另外打开一个命令行窗口
======================
[root@node1 ~]# ps -aux | grep vim
root 7247 0.0 0.2 245844 8536 pts/1 S+ 16:34 0:00 vim README
root 7298 0.0 0.0 221940 1108 pts/0 S+ 16:39 0:00 grep --color=auto vim
[root@node1 ~]#
[root@node1 ~]# kill -19 7247 # 通过kill发送信号暂停进程
[root@node1 ~]#
======================
回到vim编辑的窗口
======================
[1]+ Stopped vim README
[root@node1 ~]# jobs
[1]+ Stopped vim README
[root@node1 ~]# fg %1 # 恢复到前台运行
vim README # 进入vim编辑视图
Case3:后台运行一个进程,重定向输出
[root@node1 ~]# tar -zcvf /tmp/tmp.tgz /tmp 2&> log.txt &
[1] 7409
[root@node1 ~]#
[1]+ Exit 2 tar -zcvf /tmp/tmp.tgz /tmp 2 &> log.txt
[root@node1 ~]#
[root@node1 ~]# cat log.txt
tar: Removing leading `/' from member names
/tmp/
/tmp/ks-script-qa4dbytl
tar: Removing leading `/' from hard link targets
/tmp/ks-script-9mv4xu64
=======================================
以下省略
=======================================
[root@node1 ~]# ls -lh /tmp/tmp.tgz
-rw-r--r--. 1 root root 2.1K Jan 13 16:51 /tmp/tmp.tgz
[root@node1 ~]# tar -tf /tmp/tmp.tgz # 查看压缩包内的文件名
tmp/
tmp/ks-script-qa4dbytl
tmp/ks-script-9mv4xu64
tmp/.X11-unix/
tmp/.ICE-unix/
tmp/.XIM-unix/
=======================================
以下省略
=======================================
参阅
Linux 系统管理 : top 命令详解_linux top-CSDN博客
标签:tmp,httpd,管理,vim,node1,Linux,进程,root From: https://blog.51cto.com/min2000/9232755