ubuntu进程管理工具(ubuntu Linux怎么解决僵尸进程)

本文目录
ubuntu Linux怎么解决僵尸进程
Linux 允许进程查询内核以获得其父进程的 PID,或者其任何子进程的执行状态。例如,进程可以创建一个子进程来执行特定的任务,然后调用诸如 wait() 这样的一些库函数检查子进程是否终止。如果子进程已经终止,那么,它的终止代号将告诉父进程这个任务是否已成功地完成。
为了遵循这些设计原则,不允许 Linux 内核在进程一终止后就丢弃包含在进程描述符字段中的数据。只有父进程发出了与被终止的进程相关的 wait() 类系统调用之后,才允许这样做。这就是引入僵死状态的原因:尽管从技术上来说进程已死,但必须保存它的描述符,直到父进程得到通知。
如果一个进程已经终止,但是它的父进程尚未调用 wait() 或 waitpid() 对它进行清理,这时的进程状态称为僵死状态,处于僵死状态的进程称为僵尸进程(zombie process)。任何进程在刚终止时都是僵尸进程,正常情况下,僵尸进程都立刻被父进程清理了。
僵尸进程是如何产生的
在UNIX 系统中,一个进程结束了,但是他的父进程没有等待(调用wait / waitpid)他,那么他将变成一个僵尸进程。通过ps命令查看其带有defunct的标志。僵尸进程是一个早已死亡的进程,但在进程表 (processs table)中仍占了一个位置(slot)。
但是如果该进程的父进程已经先结束了,那么该进程就不会变成僵尸进程。因为每个进程结束的时候,系统都会扫描当前系统中所运行的所有进程,看看有没有哪个 进程是刚刚结束的这个进程的子进程,如果是的话,就由Init进程来接管他,成为他的父进程,从而保证每个进程都会有一个父进程。而Init进程会自动 wait其子进程,因此被Init接管的所有进程都不会变成僵尸进程。
为了观察到僵尸进程,我们自己写一个不正常的程序,父进程 fork 出子进程,子进程终止,而父进程既不终止也不调用 wait 清理子进程:
?
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
#include 《unistd.h》
#include 《stdio.h》
#include 《stdlib.h》
int main(void)
{
int i = 100;
pid_t pid=fork();
if(pid 《 0)
{
perror("fork failed.");
exit(1);
}
if(pid 》 0)
{
printf("This is the parent process. My PID is %d.\n", getpid());
for(; i 》 0; i--)
{
sleep(1);
}
}
else if(pid == 0)
{
printf("This is the child process. My PID is: %d. My PPID is: %d.\n", getpid(), getppid());
}
return 0;
}
把上面的代码保存到文件 zomprocdemo.c 文件中,并执行下面的命令编译:
?
1
$ gcc zomprocdemo.c -o zomprocdemo
然后运行编译出来的 zomprocdemo 程序:
?
1
$ ./zomprocdemo
请点击输入图片描述
此时子进程已经退出,但是父进程没有退出也没有通过 wait() 调用处理子进程。我们使用 ps 命令查看进程的状态:
请点击输入图片描述
上图红框中的大写字母 "Z" 说明 PID 为 112712 的进程此时处于僵死的状态。
让我们接着往下看!在结束 sleep 后父进程退出。当父进程退出后,子进程会变成孤儿进程,此时它会被一个管理进程收养。在不同的系统中,这个管理进程不太一样,早期一般是 init 进程,Ubuntu 上是 upstart,还有近来的 Systemd。但是它们都完成相同的任务,就是 wiat() 这些孤儿进程,并最终释放它们占用的系统进程表中的资源。这样,这些已经僵死的孤儿进程就彻底的被清除了。
僵尸进程的危害
在进程退出的时候,内核释放该进程所有的资源,包括打开的文件,占用的内存等。但是仍然为其保留一定的信息(包括进程号 PID,退出状态 the termination status of the process,运行时间 the amount of CPU time taken by the process 等)。直到父进程通过 wait / waitpid 来取时才释放。
如果进程不调用 wait / waitpid 的话, 那么保留的那段信息就不会释放,其进程号就会一直被占用,但是系统所能使用的进程号是有限的,如果大量的产生僵死进程,将因为没有可用的进程号而导致系统不能产生新的进程。
如何处理僵尸进程
僵尸进程的产生是因为父进程没有 wait() 子进程。所以如果我们自己写程序的话一定要在父进程中通过 wait() 来避免僵尸进程的产生。
当系统中出现了僵尸进程时,我们是无法通过 kill 命令把它清除掉的。但是我们可以杀死它的父进程,让它变成孤儿进程,并进一步被系统中管理孤儿进程的进程收养并清理。
下面的 demo 中,父进程通过 wait() 等待子进程结束:
?
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
#include 《sys/types.h》
#include 《sys/wait.h》
#include 《unistd.h》
#include 《stdio.h》
#include 《stdlib.h》
int main(void)
{
pid_t pid;
pid = fork();
if (pid 《 0)
{
perror("fork failed");
exit(1);
}
if (pid == 0) {
int i;
for (i = 3; i 》 0; i--)
{
printf("This is the child\n");
sleep(1);
}
// exit with code 3 for test.
exit(3);
}
else
{
int stat_val;
wait(&stat_val);
if (WIFEXITED(stat_val))
{
printf("Child exited with code %d\n", WEXITSTATUS(stat_val));
}
}
return 0;
}
demo 中父进程不仅等待子进程结束,还通过 WEXITSTATUS 宏取到了子进程的 exit code。
linux7的进程管理器是
Systemd。
Systemd是Linux系统中最常用的进程管理器,被广泛用于各种Linux发行版中,包括Ubuntu、Debian、Fedora等。Systemd提供了许多功能,例如启动和停止服务、管理系统日志、监控系统资源使用情况等。
一文搞懂supervisor进程管理
使用Python编写的进程管理程序supervisor来管理Python程序那是最合适不过了,supervisor基于CS架构,主要有以下两个组成部分:
基于ubuntu16.04,不同linux发行版均可使用包管理器进行安装,也可以使用源码安装和pip安装
pip安装方法
当前最新版本3.3.3,supervisord.conf 和supervisord.d文件夹已自动生成在/etc/supervisor/目录下。可以使用echo_supervisord_conf命令将配置信息重定向到制定目录,比如/etc
服务端启动
查看supervisord是否在运行
使用echo_supervisord_conf查看supervisord.conf可选的配置项:
详情如下
采用supervisord.conf和program.conf分离的方式进行本机进程管理,从默认配置中抽取出常用的supervisord模板
模板抽取基于以下考虑
从默认配置中抽取出常用的program模板
如果单独调整program日志大小和个数,则加入stdout和stderr四个参数,新的配置文件如下
一般情况下,不需要指定日志文件名称,默认的日志文件名称组成为
文件名称示例:concurrency_statistician-stderr---supervisor-OpZ5di.log.2
可以进入 supervisorctl 的 shell 界面,也可以直接在 bash 终端运行
关于program groups的命令使用较少暂不介绍
参考资料:
念念不忘,必有回响,小伙伴们帮我点个赞吧,非常感谢。
职场亮哥文章列表: 更多文章

更多文章:
全球新冠肺炎疫情背景下航运发展(盐田港复苏日志:半年历劫从“低谷”到“爆仓” 疫情之后巨轮如何越洋航行)
2026年9月7日 17:10
matlab求解带字母参数方程组(我想matlab求一个关于x,y的方程组 ab c d f e h m n 都是参数)
2026年9月7日 16:30
oracle中的循环语句(下面哪个不是oracle程序设计中的循环语句 a for)
2026年9月7日 15:30
电脑里2个系统怎么删除一个(电脑开机显示有两个系统,如何删除一个)
2026年9月7日 12:20
scrollthrough意思(“scroll”是什么意思)
2026年9月7日 08:00
怎么激活keygen(注册机如何激活cad2008一个简单激活cad2008的方法)
2026年9月7日 06:30
vba编写excel插件(excel vba中能否动态创建控件)
2026年9月7日 04:40





