一、使用subprocess模块

使用subprocess模块可创建子进程。

subprocess. Popen ( args , bufsize=0 , executable=None , stdin=None , stdout=None , stderr=None , preexec_fn=None , close_fds=False , shell=False , cwd=None , env=None , universal_newlines=False , startupinfo=None , creationflags=0 )

subprocess.Popen(['google-chrome',"http://www.baidu.com"])可打开chrome并显示百度网页。

subprocess.Popen.pid可显示子进程的id,但这只是打开的shell的id,如果此时使用pid.kill是无法杀掉所有子进程的。

杀掉所有子进程,代码:

import sys, os, subprocess, time, signal
p = subprocess.Popen(['google-chrome',"http://www.baidu.com"], close_fds=True, preexec_fn = os.setsid)
print p.pid
time.sleep(5)
# p.kill() #无法杀掉所有子进程,只能杀掉子shell的进程 # p.terminate() #无法杀掉所有子进程
os.killpg( p.pid,signal.SIGUSR1) time.sleep(3)

注意:

close_fds=True,此时除了文件描述符为0 , 1 and 2,其他子进程都要被杀掉。( Linux中所有的进程都是进程0的子进程。

pid=1的是init,内核完成之后启动的第一个进程,然后init根据/etc/inittab的内容再去启动其它进程。)

os.setsid(): 使独立于终端的进程(不响应sigint,sighup等),使脱离终端。

SIGUSR1: 用户自定义信号

os.killpg( p.pid,signal.SIGUSR1): 发送SIGUSR1信号到组进程p.pid

二、封装subprocess 函数

最近使用python 调用ansible命令,来监测系统相关服务。发现到达指定时间,ansible进程没有杀掉。导致服务器卡死。

后来尝试 使用os.killpg ,发现可以杀掉ansible 子进程。

完整代码如下:

#!/usr/bin/env python3
# coding: utf-8 import os
import time
import signal
import subprocess def execute_linux2(cmd, timeout=10, skip=False):
"""
执行linux命令,返回list
:param cmd: linux命令
:param timeout: 超时时间,生产环境, 特别卡, 因此要3秒
:param skip: 是否跳过超时限制
:return: list
"""
p = subprocess.Popen(cmd, stderr=subprocess.STDOUT, stdout=subprocess.PIPE,shell=True,close_fds=True,preexec_fn=os.setsid) t_beginning = time.time() # 开始时间
while True:
if p.poll() is not None:
break
seconds_passed = time.time() - t_beginning
if not skip:
if seconds_passed > timeout:
# p.terminate()
# p.kill()
# raise TimeoutError(cmd, timeout)
print('错误, 命令: {},本地执行超时!'.format(cmd))
# 当shell=True时,只有os.killpg才能kill子进程
try:
# time.sleep(1)
os.killpg(p.pid, signal.SIGUSR1)
except Exception as e:
pass
return False result = p.stdout.readlines() # 结果输出列表
return result

本文参考链接:

https://blog.csdn.net/heihuifeng/article/details/6543414

subprocess.popen.kill杀死所有子进程的更多相关文章

  1. subprocess.Popen模块

    该类用于在一个新的进程中执行一个子程序.subprocess模块底层的进程创建和管理是由Popen类来处理的. 1.subprocess.Popen的构造函数 class subprocess.Pop ...

  2. python中的subprocess.Popen()使用

    python中的subprocess.Popen()使用 从python2.4版本开始,可以用subprocess这个模块来产生子进程,并连接到子进程的标准输入/输出/错误中去,还可以得到子进程的返回 ...

  3. python中的subprocess.Popen()使用详解---以及注意的问题(死锁)

    从python2.4版本开始,可以用subprocess这个模块来产生子进程,并连接到子进程的标准输入/输出/错误中去,还可以得到子进程的返回值. subprocess意在替代其他几个老的模块或者函数 ...

  4. python中subprocess.Popen.poll

    import subprocess proc = subprocess.Popen(['python', 'test.py'], stdout=subprocess.PIPE) while 1: pr ...

  5. python subprocess 杀掉全部派生的子进程

     下面就是今天下午的研究成果.    发布系统需要响应用户的中断请求,需要在GET方法中杀掉由subprocess派生的子进程,刚开始直接用os.kill 发现子进程的子进程无法kill,谷歌了一些, ...

  6. Python通过subprocess.Popen.poll控制流程

    python写流程控制的时候,有时需要等待运行结果完成才能进行下一步.有几个想法: 一是反复循环判断直到生成结果文件(且文件中有预期结果),低效易出错: 二是用subprocess模块来判断进程结果, ...

  7. python subprocess.Popen 非阻塞

    1.非阻塞设置subprocess.Popen(args, stdout=subprocess.PIPE,stderr=subprocess.PIPE) def non_block_read(outp ...

  8. Python subprocess Popen

    目的:顺序执行进程  在Bash里面类似  a.sh && b.sh && c.sh 先来说下Popen这个函数 class subprocess.Popen(args ...

  9. Python Subprocess Popen 管道阻塞问题分析解决

    http://ju.outofmemory.cn/entry/279026 场景:1>不断播放mp3文件: 2>使用订阅发布模式保持tcp长连接,从服务器接收信息 造成程序hang死,但是 ...

随机推荐

  1. mysql 获取单个科目的平均分

    mysql> select * from test; +----+----------+-------+-----------+ | id | name | score | subject | ...

  2. zookeeper、hbase集成kerberos

    1.KDC创建principal 1.1.创建认证用户 登陆到kdc服务器,使用root或者可以使用root权限的普通用户操作: # kadmin.local -q “addprinc -randke ...

  3. Linux命令及作用

    uname -r :查看当前使用的Linux内核版本信息 cat /proc/cpuinfo:查看当前主机CPU型号,规格等信息 cat /proc/meminfo :查看当前主机内存信息 hostn ...

  4. Windows安装Python3 curses模块

    目录 0.前提 1.pip install wheel 2.下载.whl文件 3.pip install 它 参考 0.前提 确定你已经配置好了Python相关环境,可以正常在命令行使用pip安装. ...

  5. 2019_软工实践_Beta(5/5)

    队名:955 组长博客:点这里! 作业博客:点这里! 组员情况 组员1(组长):庄锡荣 过去两天完成了哪些任务 文字/口头描述 部署新服务器 展示GitHub当日代码/文档签入记录 接下来的计划 准备 ...

  6. hdu5387 钟表指针之间夹角(分数计算,模拟)

    题意: 给你一个24格式的数字时间,(字符串),问你这个时刻时针与分针 时针与秒针 分针与秒针 之间的夹角, 我们发现 秒针每秒转6度,分针每秒转1/10度,每分转6度,时针每小时转30度,每分转1/ ...

  7. SQLServer ROW_NUMBER()函数使用方法 分区排序

    #ROW_NUMBER() over()能干什么? 既可满足分区的需求,也可以根据一定的顺序来排序. #细细说 select ROW_NUMBER() over(partition by xm Ord ...

  8. Python dict 存放函数

    Python 字典,可以直接存放函数,并执行正常. #!/usr/bin/python3 dict1 = dict() def test_fun(): print("test dict&qu ...

  9. 必须要注意的 C++ 动态内存资源管理(五)——智能指针陷阱

    必须要注意的 C++ 动态内存资源管理(五)——智能指针陷阱 十三.小心使用智能指针.         在前面几节已经很详细了介绍了智能指针适用方式.看起来,似乎智能指针很强大,能够很方便很安全的管理 ...

  10. jdbc如何处理事务

    Connection提供了事务处理的方法,通过调用setAutoCommit(false)可以设置手动提交事务:当事务完成后用commit()显式提交事务:如果在事务处理过程中发生异常则通过rollb ...