代码示例支持
平台: 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 退出的解法)的更多相关文章

  1. Python 踩坑之旅文件系统篇其一文件夹也是个文件

    目录 1.1 案例 1.2 分析 1.3 扩展 1.4 技术关键字 下期预告 代码示例支持 平台: Mac OS Python: 2.7.10 代码示例: - wx: 菜单 - Python踩坑指南代 ...

  2. Python踩坑之旅其一杀不死的Shell子进程

    目录 1.1 踩坑案例 1.2 填坑解法 1.3 坑位分析 1.4 坑后扩展 1.4.1 扩展知识 1.4.1 技术关键字 1.5 填坑总结 1.1 踩坑案例 踩坑的程序是个常驻的Agent类管理进程 ...

  3. [代码修订版] Python 踩坑之旅 [进程篇其四] 踩透 uid euid suid gid egid sgid的坑坑洼洼

    目录 1.1 踩坑案例 1.2 填坑解法 1.3 坑位分析 1.4 技术关键字 1.5 坑后思考 下期坑位预告 代码示例支持 平台: Centos 6.3 Python: 2.7.14 代码示例: 公 ...

  4. Python 踩坑之旅进程篇其四一次性踩透 uid euid suid gid egid sgid的坑坑洼洼

    目录 1.1 踩坑案例 1.2 填坑解法 1.3 坑位分析 1.4 技术关键字 1.5 坑后思考 下期坑位预告 代码示例支持 平台: Centos 6.3 Python: 2.7.14 代码示例: 菜 ...

  5. [代码修订版] Python 踩坑之旅进程篇其五打不开的文件

    目录 1.1 踩坑案例 1.2 填坑和分析 1.2.1 从程序优化入手 1.2.2 从资源软硬限入手 1.4.1 技术关键字 下期坑位预告 代码示例支持 平台: Centos 6.3 Python: ...

  6. Python踩坑之旅其二裸用os.system的原罪

    目录 1.1 踩坑案例 1.2 填坑解法 1.3 坑位分析 1.4.1 技术关键字 1.5 填坑总结 2. 前坑回顾 2.1 Linux中, 子进程拷贝父进程哪些信息 2.2 Agent常驻进程选择& ...

  7. 美团热修复Robust的踩坑之旅-使用篇

    最近需要在项目中使用热修复框架,在这里以美团的Robust为主写一篇文章总结一下学习的过程. 一直认为要学习一个框架的原理,首先需要让他跑起来,从效果反推回去,这样更容易理解. 一.美团Robust的 ...

  8. vue+ vue-router + webpack 踩坑之旅

    说是踩坑之旅 其实是最近在思考一些问题 然后想实现方案的时候,就慢慢的查到这些方案   老司机可以忽略下面的内容了 1)起因  考虑到数据分离的问题  因为server是express搭的   自然少 ...

  9. 微信小程序之mpvue+iview踩坑之旅

    因为之前参照微信的原生的文档写过一些小程序的demo,写的过程比较繁琐,后来出了美团的mpvue,可以直接使用vue开发,其他的不作对比,这篇文章记录一下踩坑之旅. 参照mpvue http://mp ...

随机推荐

  1. BZOJ2726:任务安排(DP+斜率优化+二分)

    机器上有N个需要处理的任务,它们构成了一个序列.这些任务被标号为1到N,因此序列的排列为1,2,3...N.这N个任务被分成若干批,每批包含相邻的若干任务.从时刻0开始,这些任务被分批加工,第i个任务 ...

  2. Mac环境下安装node.js、npm、express

    一:node.js安转 方法一:下载node.js for Mac 地址: http://nodejs.org/download/ 直接下载 pkg的,双击安装,一路点next,很容易就搞定了. 安装 ...

  3. ACM学习历程—HDU4725 The Shortest Path in Nya Graph(SPFA && 优先队列)

    Description This is a very easy problem, your task is just calculate el camino mas corto en un grafi ...

  4. 连续4个小时ping不通远端主机,则本机关机

    #!/bin/bash #连续4个小时ping不通远端主机,则本机关机. begin_time=$(date "+%s") while true;do sleep 2 ping - ...

  5. ubuntu14.04 设置默认使用root用户登录

    首先修改/etc/lightdm/lightdm.conf,设置autologin-user=root 但是此时直接重启,会报如下的错误: 解决办法: 使用命令: vim /root/.profile ...

  6. CS231n 2016 通关 第六章 Training NN Part2

    本章节讲解 参数更新 dropout ================================================================================= ...

  7. java.lang.NoClassDefFoundError: javassist/util/proxy/MethodFilter

    转自:https://blog.csdn.net/rchm8519/article/details/23788053 1. ERROR - Context initialization failedo ...

  8. JavaScript代码放在HTML代码不同位置的差别

    通常情况下,JavaScript 代码是和 HTML 代码一起使用的,可以将 JavaScript 代码放置在 HTML 文档的任何地方.但放置的地方,会对 JavaScript 代码的正常执行会有一 ...

  9. 洛谷 - P1631 - 序列合并 - 堆

    https://www.luogu.org/problemnew/show/P1631 序列a中每个数首先都和序列b中的最小元素配对(虽然好像不是很必要这么早插进来?) 每次从堆顶取出最小的和输出答案 ...

  10. 2014-9-27 NOIP模拟赛

    1.栅栏迷宫 田野上搭建了一个黄金大神专用的栅栏围成的迷宫.幸运的是,在迷宫的边界上留出了两段栅栏作为迷宫的出口.更幸运的是,所建造的迷宫是一个“完美的”迷宫:即你能从迷宫中的任意一点找到一条走出迷宫 ...