🌈个人主页:Dream云原生梦工厂
🔥系列专栏:《夜莺(N9e-categraf)监控从入门到精通》、《SRE高级运维 从0到1》、《解决日常问题的小case》
🔖“ 乾坤未定,你我皆黑马。”
---------------------------------------------------------------------------------------------------------------------------------
目录
一:什么是进程
名字 | 含义 |
程序 | 程序 安装包,程序代码,app,存放在磁盘上面. |
进程⭐️ | 运行起来的程序,命令,服务(远程连接服务,网络服务)都可以称作进程。 运行在内存中。 |
守护进程 | 守护进程, 一直运行的进程. 也可以叫做服务. |
二:进程分类(异常进程)
1.僵尸进程 ⭐️⭐️⭐️⭐️⭐️
僵尸进程是当子进程比父进程先结束,而父进程又没有回收子进程,释放子进程占用的资源,此时子进程将成为一个僵尸进程。
僵尸进程:由于各种原因导致某个进程挂掉了,但是进程本身仍然存在,还占用着系统资源,这种异常进程僵尸进程。
查找:可以通过ps aux过滤 Z状态即可找出僵尸进程或top命令查看。
解决: 方案01:找出僵尸进程的上级进程,结束进程即可。
方案02:如果上级进程是主进程(pid为1进程),则需要重启Linux系统。
温馨提示: pstree属于psmisc软件包,yum安装psmisc即可. |
2.孤儿进程 ⭐️
孤儿进程是指在计算机操作系统中,当一个进程的父进程先于它结束运行(或被终止),而该进程仍在运行时,这个子进程就称为孤儿进程(Orphan Process)。一旦发生这种情况,操作系统中的init进程(进程号通常是1,或者在Systemd系统中是systemd)会自动接手这些孤儿进程,成为它们的新父进程。init进程会持续监控所有被其收养的孤儿进程,直到它们自然结束为止,并负责收集它们的退出状态信息,从而确保系统资源得到正确释放,不会因为父进程缺失而导致资源泄露等问题。
3.演示僵尸进程 ⭐️⭐️
① 首先写一个c文件模拟僵尸进程。
#include <sys/types .h>
#include <sys/wait.h>
#include <errno.h>
#include <unistd.h>
#include <stdlib.h>
#include <stdio.h>
#include <string.h>
int main(int argc, char *argv[])
{
pid t pid;
pid = fork();
if (pid == 0) {
int iPid = (int)getpid();
fprintf(stderr,"I am child,%d\n",iPid);
sleep(1);
fprintf(stderr,"Child exits\n");
return EXIT SUCCESS;
}
int iPid = (int)getpid();
fprintf(stderr,"I am parent,%d\n",iPid);
fprintf(stderr,"sleep....\n");
sleep(600);
fprintf(stderr,"parent exits\n");
return EXIT SUCCESS;
}
②创建完成后中通过gcc生成僵尸进程的命令文件。
[root@king tools]# gcc zombine.c -o zombine
[root@king tools]# ll zombine*
-rwxr-xr-x 1 root root 8648 7月 27 10:03 zombine
-rw-r -r - 1 root root 591 7月 27 10:03 zombine.c
运行僵尸进程
./zombine
③top命令查看是否有僵尸进程。
④过滤出僵尸进程。
ps aux |grep Z #找出僵尸进程的pid
USER PID %CPU %MEM VSZ RSS TTY STAT START TIME COMMAND
root 2188 0.0 0.0 0 0 pts/0 Z+ 10:04 0:00 [zombine] <defunct>
root 2191 0.0 0.0 112824 960 pts/1 R+ 10:05 0:00 grep -color=auto Z
发现僵尸进程的pid是2188
⑤pstree -p查看僵尸进程的父进程(上级进程)。
pstree -p |grep 2188
├─sshd(1344)─┬─sshd(1641)───bash(1643)───zombine(2187)───zombine(2188)
⑥直接结束僵尸进程
kill 2188 #失败,无法直接结束僵尸进程
⑦结束僵尸进程的父进程
kill 2187 #成功