目錄html
代碼示例支持 |
---|
平臺: Centos 6.3 |
Python: 2.7.14 |
Github: https://github.com/baidu/CUP |
pid, ppid是你們比較常見的術語, 表明進程號,父進程號. 但pgid是個什麼鬼?python
瞭解pgid以前, 咱們先複習下:mysql
os.system
或者Popen
家族啓動子進程這個場景還有個後續就是:linux
這個就是今天咱們遇到的坑, 怎麼處理孫子進程. 你們注意, 不只是Python會遇到這個問題, 其餘語言包括 Shell 都同樣會遇到這種"孫子"進程怎麼進程異常處理的問題.git
本期的坑位解法其實有兩種, 第一種比較暴力, 簡稱窮盡搜索孫子法.github
a. 窮盡搜索孫子法, 代碼示例sql
關鍵點:shell
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, 注意不是pidbash
# 以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)
進程組特性
a. 在*unix 編程中, 進程組(man getpgid
)概念是個很重要但容易被忽略的內容
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.
坑位解決