Python 踩坑之旅进程篇其三pgid是个什么鬼 (子进程\子孙进程无法kill 退出的解法)
| 代码示例支持 |
|---|
| 平台: Centos 6.3 |
| Python: 2.7.14 |
| Github: https://github.com/baidu/CUP |
1.1 踩坑案例
pid, ppid是大家比较常见的术语, 代表进程号,父进程号. 但pgid是个什么鬼?
了解pgid之前, 我们先复习下:
- 进程篇其一
- 里面场景是: 一个进程通过
os.system或者Popen家族启动子进程 - 后通过杀死父进程的方式无法杀死它的连带子进程
- 我们通过其他方式进行了解决
- 里面场景是: 一个进程通过
这个场景还有个后续就是:
- 如果这个子进程还有孙子怎么办?
- 它还有孙子的孙子怎么办?
这个就是今天我们遇到的坑, 怎么处理孙子进程. 大家注意, 不仅是Python会遇到这个问题, 其他语言包括 Shell 都一样会遇到这种"孙子"进程怎么进程异常处理的问题.
1.2 填坑解法
本期的坑位解法其实有两种, 第一种比较暴力, 简称穷尽搜索孙子法.
a. 穷尽搜索孙子法, 代码示例
关键点:
- 使用cup.res.linux中的Process类, 获得该进程所有的子孙进程
- 使用kill方法全部杀死
from cup.res import linux
pstatus = linux.Process(pid)
for child in pstatus.children(recursive=True):
os.kill(child, signal.SIGKILL)
b. 获得该进程的 PGID, 进行 kill 操作
b1. 先讲个 shell 操作的做法, 使用ps 获取进程的pgid, 注意不是pid
# 以mysqld为例, 注意 pgid 项
ps -e -o uid,pid,gid,pgid,cmd|grep mysql
结果:
注意其中第三列, 该进程和子进程都使用了同样的pgid 9779
9790 0 9779 /bin/sh /usr/bin/mysqld_safe --datadir=/home/maguannan/mysql/mysql/....
10171 501 9779 /home/maguannan/bin/mysqld --basedir=/home/maguannan/mysql/....
通过
kill -9 -9779的方式可以杀死该pgid底下的所有子孙进程
b2. 在讲 Python 里的处理方式
import os
import signal
from cup.res import linux
pstatus = linux.Process(pid)
os.killpg(pstatus.getpgid(), signal.SIGKILL)
1.3 坑位分析
进程组特性
a. 在*unix 编程中, 进程组(man getpgid)概念是个很重要但容易被忽略的内容
- 进程组ID (pgid) 标记了一系列相关的进程
- 进程组有一个组长进程, 一般组长进程 ID 等于进程组 ID
- 进程组只要任一进程存在, 进程组就存在. 进程组存在与否与组长死活无关
- 可以通过setpgid方式设置一个进程 pgid
- 一个进程只能为自己或者子进程设置进程组 id
- 子进程一旦执行了exec函数, 它就不能改变子进程的进程组 id
b. 进程组内的所有成员会收到来自相同的信号
引用 wikipedia 原文:
a process group is used to control the distribution of a signal; when a signal is directed to a process group, the signal is delivered to each process that is a member of the group.
坑位解决
- 由于进程组拥有以上的特性, 进程组内的进程可以被当做相同的处理单元
- 默认子进程与父进程拥有同样的进程组
- 组内每个进程收到相同的信号)
- 使用kill发送信号 SIGKILL 即可满足杀死所有子孙进程的目的
1.4.1 技术关键字
- pgid 进程组
- pid, ppid 进程ID, 父进程ID
下期坑位预告
- 踩坑之旅进程篇其四: 一次性踩透uid, euid, gid, egid的坑坑洼洼
Python 踩坑之旅进程篇其三pgid是个什么鬼 (子进程\子孙进程无法kill 退出的解法)的更多相关文章
- Python 踩坑之旅文件系统篇其一文件夹也是个文件
目录 1.1 案例 1.2 分析 1.3 扩展 1.4 技术关键字 下期预告 代码示例支持 平台: Mac OS Python: 2.7.10 代码示例: - wx: 菜单 - Python踩坑指南代 ...
- Python踩坑之旅其一杀不死的Shell子进程
目录 1.1 踩坑案例 1.2 填坑解法 1.3 坑位分析 1.4 坑后扩展 1.4.1 扩展知识 1.4.1 技术关键字 1.5 填坑总结 1.1 踩坑案例 踩坑的程序是个常驻的Agent类管理进程 ...
- [代码修订版] Python 踩坑之旅 [进程篇其四] 踩透 uid euid suid gid egid sgid的坑坑洼洼
目录 1.1 踩坑案例 1.2 填坑解法 1.3 坑位分析 1.4 技术关键字 1.5 坑后思考 下期坑位预告 代码示例支持 平台: Centos 6.3 Python: 2.7.14 代码示例: 公 ...
- Python 踩坑之旅进程篇其四一次性踩透 uid euid suid gid egid sgid的坑坑洼洼
目录 1.1 踩坑案例 1.2 填坑解法 1.3 坑位分析 1.4 技术关键字 1.5 坑后思考 下期坑位预告 代码示例支持 平台: Centos 6.3 Python: 2.7.14 代码示例: 菜 ...
- [代码修订版] Python 踩坑之旅进程篇其五打不开的文件
目录 1.1 踩坑案例 1.2 填坑和分析 1.2.1 从程序优化入手 1.2.2 从资源软硬限入手 1.4.1 技术关键字 下期坑位预告 代码示例支持 平台: Centos 6.3 Python: ...
- Python踩坑之旅其二裸用os.system的原罪
目录 1.1 踩坑案例 1.2 填坑解法 1.3 坑位分析 1.4.1 技术关键字 1.5 填坑总结 2. 前坑回顾 2.1 Linux中, 子进程拷贝父进程哪些信息 2.2 Agent常驻进程选择& ...
- 美团热修复Robust的踩坑之旅-使用篇
最近需要在项目中使用热修复框架,在这里以美团的Robust为主写一篇文章总结一下学习的过程. 一直认为要学习一个框架的原理,首先需要让他跑起来,从效果反推回去,这样更容易理解. 一.美团Robust的 ...
- vue+ vue-router + webpack 踩坑之旅
说是踩坑之旅 其实是最近在思考一些问题 然后想实现方案的时候,就慢慢的查到这些方案 老司机可以忽略下面的内容了 1)起因 考虑到数据分离的问题 因为server是express搭的 自然少 ...
- 微信小程序之mpvue+iview踩坑之旅
因为之前参照微信的原生的文档写过一些小程序的demo,写的过程比较繁琐,后来出了美团的mpvue,可以直接使用vue开发,其他的不作对比,这篇文章记录一下踩坑之旅. 参照mpvue http://mp ...
随机推荐
- 动态创建TeeChart的简便方法
最近在项目中使用Teechart ocx版本替换了labview的老版本控件,显示效果和效率均有提高,但是却遇到多线程下报access violation的问题. 翻遍大小论坛,最后在官网论坛找到相同 ...
- linux命令学习笔记(62)-curl命令-url下载工具
linux curl是一个利用URL规则在命令行下工作的文件传输工具.它支持文件的上传和下载,所以是综合 传输工具,但按传统,习惯称url为下载工具. 一,curl命令参数,有好多我没有用过,也不知道 ...
- bjwc Day2 玄学
早晨起来很开心,因为昨天跟妹子聊天聊到很晚 然后看到了题,感觉:这tm才是冬令营呀! T1构造,并没有找到性质,暴力都懒得打 T2数位dp,状态比较麻烦,看来跟dmy想到一起了,然后搞一下搞完 T3放 ...
- MySQL left join 20161024
公司OA系统上部门上线了一套流程,总部和分公司部门提数据需求都要走线上流程,审批,想想也是不错的,能和绩效更加合理的挂钩,还有打分评价,双向互动. 下午接到一个需求,查看某分公司上周订单使用优惠券情况 ...
- C++之MutexLock和MutexLockGuard封装
noncopyable.h #ifndef __WD_NONCOPYABLE_H__ #define __WD_NONCOPYABLE_H__ namespace wd { class Noncopy ...
- 普通项目转为maven项目及相关操作说明
普通项目转为maven项目及相关操作说明 1 原项目简述 如图,一般的项目大致包括三类路径:src,源码路径:test,单元测试路径:lib第三方类包路径. 示例项目中,BaseDao类依赖于mysq ...
- SQL SERVER 判断是否存在数据库、表、列、视图
SQL SERVER 判断是否存在数据库.表.列.视图 --1. 判断数据库是否存在 IF EXISTS (SELECT * FROM SYS.DATABASES WHERE NAME = '数据库名 ...
- C# 获取Console的输入和输出 数据 (异步)
using System ; using System .Diagnostics; using System .IO; class Program { static void Main() ...
- Pmod使用的4种模式
引言 多年以来,一直存在标准泛滥的现象,而我们电子业尤其严重.您是否曾经想过,为什么我们对有些奇怪的数字或测量计的东西建立标准?关于航天飞机的固体燃料火箭推进器的直径是否真的源自于马屁股的宽度的讨论非 ...
- go实现冒泡排序和快速排序
项目结构 冒泡排序算法,源文件bubblesort.go package bubblesort // 冒泡排序 func BubbleSort(values []int) { for i := 0; ...