僵死进程

关于僵死进程的产生原因以及解决方案 说到僵死进程大家应该经常听过可能优点不明白这个意思,首先僵死进程就是指子进程退出时,父进程并未对其发出的SIGCHLD信号进行适当处理,导致子进程停留在僵死状态等待其父进程为其收尸,这个状态下的子进程就是僵死进程。 就是一个进程在他结束生命时并不是真正意义上的销毁,而是调用了exit()把一个正常的进程变成了僵死进程,这个僵死进程不占有内存,也不会执行代码,更不能被调用,他只是在进程列表中占了个地位而已。 所以解决办法就是: 1.他只需要父进程调用wait()函数来替他收尸然后就完整的结束这一生。否则 阅读详情

僵尸进程

   在fork()/execve()过程中,假设子进程结束时父进程仍存在,而父进程fork()之前既没安装SIGCHLD信号处理函数调用 waitpid()等待子进程结束,又没有显式忽略该信号,则子进程成为僵尸进程,无法正常结束,此时即使是root身份kill -9也不能杀死僵尸进程。补救办法是杀死僵尸进程的父进程(僵尸进程的父进程必然存在),僵尸进程成为"孤儿进程",过继给1号进程init,init始 终会负责清理僵尸进程。
  僵尸进程是指的父进程已经退出,而该进程dead之后没有进程接受,就成为僵尸进程.(zombie)进程
  怎样产生僵尸进程的:
  一个进程在调用exit命令结束自己的生命的时候,其实它并没有真正的被销毁,而是留下一个称 为僵尸进程(Zombie)的数据结构(系统调用exit,它的作用是使进程退出,但也仅仅限于将一个正常的进程变成一个僵尸进程,并不能将其完全销 毁)。在Linux进程的状态中,僵尸进程
  是非常特殊的一种,它已经放弃了几乎所有内存空间,没有任何可执行代码,也不能被调度,仅仅在进程列表中保留一个位置,记载该进程的退
  出状态等信息供其他进程收集,除此之外,僵尸进程不再占有任何内存空间。它需要它的父进程来为它收尸,如果他的父进程没安装SIGCHLD信
  号处理函数调用wait或waitpid()等待子进程结束,又没有显式忽略该信号,那么它就一直保持僵尸状态,如果这时父进程结束了,那么init进程自动
  会接手这个子进程,为它收尸,它还是能被清除的。但是如果如果父进程是一个循环,不会结束,那么子进程就会一直保持僵尸状态,这就是为什么系统中有时会有很多的僵尸进程。
  怎么查看僵尸进程:
  利用命令ps,可以看到有标记为Z的进程就是僵尸进程。
  怎样来清除僵尸进程:
  1.改写父进程,在子进程死后要为它收尸。具体做法是接管SIGCHLD信号。子进程死后,会 发送SIGCHLD信号给父进程,父进程收到此信号后,执行waitpid()函数为子进程收尸。这是基于这样的原理:就算父进程没有调用wait,内核 也会向它发送SIGCHLD消息,尽管对的默认处理是忽略,如果想响应这个消息,可以设置一个处理函数。
  2.把父进程杀掉。父进程死后,僵尸进程成为"孤儿进程",过继给1号进程init,init始终会负责清理僵尸进程.它产生的所有僵尸进程也跟着消失。
  ===========================================
  在Linux中可以用
  ps auwx
  发现僵尸进程
  a all w/ tty, including other users 所有窗口和终端,包括其他用户的进程
  u user-oriented 面向用户(用户友好)
  -w,w wide output 宽格式输出
  x processes w/o controlling ttys
  在僵尸进程后面 会标注
  ps axf
  看进程树,以树形方式现实进程列表
  ps axm
  会把线程列出来,在linux下进程和线程是统一的,是轻量级进程的两种方式。
  ps axu
  显示进程的详细状态
  ===========================================
  killall
  kill -15
  kill -9
  一般都不能杀掉 defunct进程
  用了kill -15,kill -9以后 之后反而会多出更多的僵尸进程
  kill -kill pid
  fuser -k pid
  可以考虑杀死他的parent process,
  kill -9 他的parent process
  ===========================================
  一个已经终止,但是其父进程尚未对其进行善后处理(获取终止子进程的有关信息、释放它仍占用的资源)的进程被称为僵死进程(Zombie Process)。
  避免zombie的方法:
  1)在SVR4中,如果调用signal或sigset将SIGCHLD的配置设置为忽略,则不会产生僵死子进程。另外,使用SVR4版的sigaction,则可设置SA_NOCLDWAIT标志以避免子进程僵死。
  Linux中也可使用这个,在一个程序的开始调用这个函数
  signal(SIGCHLD,SIG_IGN);
  2)调用fork两次。程序8 - 5 实现了这一点。
  3)用waitpid等待子进程返回.
  ===========================================
  zombie进程是僵死进程。防止它的办法,一是用wait,waitpid之类的函数获得
  进程的终止状态,以释放资源。另一个是fork两次
  ===========================================
  defunct进程只是在process table里还有一个记录,其他的资源没有占用,除非你的系统的process个数的限制已经快超过了,zombie进程不会有更多的坏处。
  可能唯一的方法就是reboot系统可以消除zombie进程。
  ===========================================
  任何程序都有僵尸状态,它占用一点内存资源(也就是进程表里还有一个记录),仅仅是表象而已不必害怕。如果程序有问题有机会遇见,解决大批量僵尸简单有效的办法是重起。kill是无任何效果的
  fork与zombie/defunct"
  在Unix下的一些进程的运作方式。当一个进程死亡时,它并不是完全的消失了。进程终止,它不 再运行,但是还有一些残留的小东西等待父进程收回。这些残留的东西包括子进程的返回值和其他的一些东西。当父进程 fork() 一个子进程后,它必须用 wait() 或者 waitpid() 等待子进程退出。正是这个 wait() 动作来让子进程的残留物消失。
  自然的,在上述规则之外有个例外:父进程可以忽略 SIGCLD 软中断而不必要 wait()。可以这样做到(在支持它的系统上,比如Linux):
  main()
  {
  signal(SIGCLD, SIG_IGN); /* now I don't have to wait()! */
  .
  .
  fork();
  fork();
  fork(); /* Rabbits, rabbits, rabbits! */
  }
  现在,子进程死亡时父进程没有 wait(),通常用 ps 可以看到它被显示为“”。它将永远保持这样 直到 父进程 wait(),或者按以下方法处理。
  这里是你必须知道的另一个规则:当父进程在它wait()子进程之前死亡了(假定它没有忽略 SIGCLD),子进程将把 init(pid 1)进程作为它的父进程。如果子进程工作得很好并能够控制,这并不是问题。但如果子进程已经是 defunct,我们就有了一点小麻烦。看,原先的父进程不可能再 wait(),因为它已经消亡了。这样,init 怎么知道 wait() 这些 zombie 进程。
  答案:不可预料的。在一些系统上,init周期性的破坏掉它所有的defunct进程。在另外 一些系统中,它干脆拒绝成为任何defunct进程的父进程,而是马上毁灭它们。如果你使用上述系统的一种,可以写一个简单的循环,用属于init的 defunct进程填满进程表。这大概不会令你的系统管理员很高兴吧?
  你的任务:确定你的父进程不要忽略 SIGCLD,也不要 wait() 它 fork() 的所有进程。不过,你也未必 要 总是这样做(比如,你要起一个 daemon 或是别的什么东西),但是你必须小心编程,如果你是一个 fork() 的新手。另外,也不要在心理上有任何束缚。
  总结:
  子进程成为 defunct 直到父进程 wait(),除非父进程忽略了 SIGCLD 。
  更进一步,父进程没有 wait() 就消亡(仍假设父进程没有忽略 SIGCLD )的子进程(活动的或者 defunct)成为 init 的子进程,init 用重手法处理它们。
怎样处理僵死进程 首先大家知道什么叫做僵死进程吗???????????? 1》僵死进程的定义(也叫僵尸进程): 僵死进程其实就是指在子进程退出时,父进程并未对其发出的SIGCHLD的信号进行适当处理,导致子进程停留在僵死状态等待其父进程为其收尸,这个状态下的子进程就是僵死进程;僵死进程它不占用内存空间,也没有任何可执行的代码,也不能被调度,仅仅在进程列表中保留一个位置,记载该进程的退出状态等信息供其它进程收集; 阅读详情

相关推荐

逆向实战:Soul聊天协议加密与Frida绕过检测

本文详细解析了Soul聊天协议逆向分析的全过程,重点介绍了如何利用Frida绕过应用的反调试检测机制。通过静态分析定位关键SO库,并编写Frida脚本动态Hook线程创建函数,成功实现对抗。文章还进一步追踪了基于DES算法的加密流程,并探讨了协议数据结构的解析方法,为移动应用安全研究提供了实战参考。

2w3e4r5t6y的博客 1131

kill -9 进程杀不掉,怎么办?

点击上方蓝色“程序猿DD”,选择“设为星标”回复“资源”获取独家整理的学习资料!来源 |https://blog.youkuaiyun.com/21aspnet/article/details/6...

程序猿DD 3517

AI赋能工业自动化:传感器大数据实战

工业自动化中AI与传感器大数据的结合,显著提升了生产效率与可靠性。关键技术包括实时数据处理、边缘计算和数字孪生,未来将进一步向自主决策系统演进。

AFAGA_x的博客 413

操作系统之进程和线程(僵尸进程、孤儿进程、守护进程、Linux常见命令)

1. 僵尸进程 ① 僵尸进程概述 什么是僵尸进程? 在Linux系统中,任何一个子进程在调用exit()函数结束运行后,内核会释放该进程的所有资源,包括占用的内存和打开的文件等。 同时,也会留下一个叫做僵尸进程(Zombie)的数据结构,Zombie中存储了该进程的进程号、退出码、退出状态、使用的CPU时间等信息。即僵尸进程是早已死亡的子进程,但在进程表中占了一个位置(slot)。 子进程还会向父进程发送SIGCHLD信号,父进程调用wait()或者waitpid()函数可以将僵尸进程释放(为它收尸)。 父

modi000的博客 1213

Windows下ArduPilot SITL仿真环境搭建与QGC地面站联调全攻略

软件在环仿真(SITL)是无人机开发中的关键一环,它通过将飞控固件运行在PC上,用数学模型模拟传感器数据,实现无硬件依赖的飞行逻辑验证。这项技术不仅降低了试错成本,更为地面站开发、自动化测试和任务规划提供了安全可控的试验场。在工程实践中,MAVLink协议作为飞控与地面站之间的通信桥梁,贯穿仿真、遥测与指令控制全程。结合QGroundControl(QGC)这一主流地面站,开发者可以直观地观察飞行状态、规划航点并记录日志。本文以Windows原生环境为例,详细介绍ArduPilot SITL的搭建流程、MA

weixin_31858171的博客 316

【ROS】ROS2导航Nav2:简介、安装、测试效果、错误处理

在ROS2中自动导航使用Nav2来实现。Nav2 使用几个独立的模块化服务,通过 ROS 2接口(例如动作服务器或服务)与行为树 (BT) 通信。Nav2 输入包括:TF转换、一个地图源、一个行为树 (BT) XML 文件和相关的传感器数据源;Nav2 输出速度命令;Nav2 支持多种机器人,比如:四足机器人、履带机器人、轮式机器人等。

郭老二 5078

僵尸进程详解

僵尸进程简介“僵尸”进程是什么?通常情况下,造成僵尸进程的成因是因为该进程本应该已经执行完毕,但是该进程的父进程却无法完整的将该进程结束掉,而造成该进程一直存在于内存中。那么如何查看一个进程是否为僵尸进程呢?ps:将某个时间点的进程运行状态选取下来ps aux //查看系统所有的进程数据 -A:所有的进程均显示出来 -a:不与terminal有关的所有进程 -u:有效用户相关的进程 -x:通常

Maple的博客 8457

基于Simulink的H∞鲁棒控制器设计与仿真建模示例

本文介绍了基于Simulink的H∞鲁棒控制器设计与仿真方法。针对质量-弹簧-阻尼系统存在±50%刚度不确定性的问题,详细阐述了从构建广义被控对象、设计性能加权函数,到使用hinfsyn综合控制器的完整流程。通过Simulink仿真验证,所设计的H∞控制器在参数摄动和外部扰动下均保持良好性能,位移控制误差小于2%,扰动衰减超过20dB。相比传统PID控制,H∞方法展现出显著鲁棒性优势。文章还总结了工程实践中的加权函数调参技巧、控制器降阶方法,并展望了μ-综合等扩展方向,为处理系统不确定性提供了实用解决方案。

amy_mhd的博客 70

僵尸进程的产生原因和解决方法

当一个进程(通常是父进程)创建了一个子进程,但是在子进程终止后,父进程没有及时处理子进程的终止状态,就会导致僵尸进程的产生。这个时候,子进程虽然已经终止,但是其进程表中的进程状态信息仍然被保留,直到父进程通过相关系统调用(如wait()或waitpid())来获取子进程的终止状态。如果父进程没有调用这些函数,子进程就会一直处于僵尸状态,占用系统资源。即。

ZZU_LGY 4941

3D点云-CVPR 2020-PF-Net: Point Fractal Network for 3D Point Cloud Completion

是一种专门为三维点云补全设计的深度学习模型。点云补全实际上和图片补全是一个逻辑,都是采用GAN模型的思想来进行补全,在图片补全中,将部分像素点删除并且标记,然后卷积特征提取预测、判别器判别,来训练模型,生成的像素点与原来像素点比较完成模型的训练。而PF-Net就是采用GAN的思想在3D点云上的应用。

404 Not Found 2369

北斗导航 | 基于matlab的卫星导航单点定位算法

单点定位(Single Point Positioning, SPP)通过接收机观测至少4颗卫星的伪距(含误差的距离测量值),解算接收机位置(经度、纬度、高度)及钟差。HDOP < 2 为高精度定位条件。

尘世冰封的专栏 969

进程控制-解决僵尸进程

1.进程终止 2.1进程终止的场景 代码运行结束,结果正确;好比点外卖,点上了,送来点的外卖。 代码运行结束,结果不正确;好比点外卖,约上了,但是送错了。 代码异常终止;好比点外卖,点都没点上。 2.2正常终止(可以通过“ echo $?查看进程退出码) : 从main函数当中的return返回 并不是所有函数的return都能结束进程,只有main函数的return才能结束进程。 调用exit函数(库函数) 看到函数先man 可.

weixin_45897952的博客 2297

visio安装包

Microsoft Office Visio 是一款专业的制图软件。利用经过更新的形状、协作工具和数据链接图表,创建专业级图表以简化复杂的信息。

小议Linux中的僵死进程

这篇博客介绍了linux中僵死进程的产生原因,消除僵死进程的方法,以及init进程是如何消除僵死进程的。

小菜鸟上校的专栏 2239

锂电池充电器电路设计 里面有电路

锂电池充电器电路设计 里面有电路 3.7V升压到5V电路设计。

win10 跳过U8环境检测的IE WebControls.rar

win10 安装u8的时候 提示IE WebControls 不通过,这个工具可以欺骗u8的检查。 跳过U8环境检测的IE WebControls。提示导入失败后,重新检测通过。

Linux 僵死进程

正常我们的进程结束,比如说子进程结束,这个进程实体就会被释放掉,接下来会把PCB也移除,这样子,整个操作系统中就再也找不到它了,但是,linux设计的时候:当子进程结束以后,这个进程实体就没有,但是这个PCB会把暂时保留下来,父进程去获取子进程PCB的退出码,然后再删除这个子进程的PCB,这个子进程就彻底消失了,如果父进程不去获取,那么这个PCB就一直保留着,此时子进程已经结束了,退出了,这个子进程的PCB的状态是僵死状态。或者等父进程结束,Init进程收养孤儿进程,调用wait()获取子进程退出码。

ljy的博客 658

VC中sqlite的使用

在VC中对sqlite的使用,实现数据库大批数据的快速插入,读取数据库中的数据在ListCtrl中显示

如何处理僵死进程?

如何处理僵死进程?        给进程设置僵尸状态的目的是维护子进程的信息,以便父进程在以后某个时间获取,这些信息包括进程的 pid、终止状态以及资源的利用信息(CPU时间,内存使用量等)。如果一个进程终止,而该进程有子进程处于僵尸状态,那么它的所有僵尸子进程的 ppid 将被重置为1(init 进程)。继承这些子进程的 init 进程将清理它们(init 进程将 wait 它们,从而去除僵死

YLH_yanlinghui的博客 759

如何处理僵死进程

在编程中常常会产生许多子进程,当子进程终止时如果不对其进行处理则会一直是僵死进程。如果系统中存在过多的将是进程的话,则会严重影响机器的性能。下面将说明如何处理僵死进程。

格物致知 学以致用 801

Linux僵死进程及文件操作

两个参数用于打开一个已经存在的文件;三个参数的用于新建一个文件,并设置访问权限;fd:对应打开的文件描述符buf:写入的文件内容;count:要写入多少个字节;返回值:ssize_t:实际写入了多少个字节;关闭文件描述符;

yk_18的博客 2785

僵死进程的意义

看了很多关于僵死进程的目的,都没有一个形象化的解释,这里结合自己个人的经验,来说明一下个人的理解。 我们假设根本不存在僵死进程,那么会发生什么?我们来进行一个CASE设计: 父进程记录所有子进程的pid记录下来,后来父进程需要查看某个子进程的信息,这里我们只能通过该子进程pid来获取进程信息,可是,如果没有僵死进程,我们能否判定这个pid是个有效的pid? 这就是一个很典型的异步问题

jike080401的博客 961

如何kill掉Ubuntu的僵死进程

做spark应用时,每提交一个应用就会多出sparksubmit进程 $ jps 3552 SparkSubmit 2164 SparkSubmit 3223 SparkSubmit 5358 Jps 当我们想kill掉这个进程时, $ kill -9 3552 $ kill -9 2164 $ kill -9 3223 再次用jps查看进程,发现SparkSubmit进程杀不掉 ...

大头皮鞋的博客 3240

linux僵死进程

http://blog.chinaunix.net/uid-23089249-id-210808.html 一个进程在调用exit命令结束自己的生命的时候,其实它并没有真正的被销毁, 而是留下一个称为僵死进程(Zombie)的数据结构(系统调用exit,它的作用是使进程退出,但也仅仅限于将一个正常的进程变成一个僵死进程,并不能将其完全销毁)。 一、僵死进程的产生    在每个进程退出的时候,内核释

http://itech.cnblogs.com 587
上一篇: 创建守护进程步骤
下一篇: Linux 设备文件
adderllyer
博客等级 码龄20年 13粉丝 21原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值