`
pypy
  • 浏览: 92417 次
  • 性别: Icon_minigender_1
  • 来自: 南京
社区版块
存档分类
最新评论

python安全管理子进程-subprocess

阅读更多
经常会用到python去调用外部 工具或者命令去干活

有的时候子进程并不按预期退出

比如,子进程由于某种原因挂在那里,

这时候也许,我们有这样一种需求:需要父进程对子进程有监控动作,即,超过一定的时间,就不再等待子进程自己退出,而是去kill子进程,回收资源


以下会列出几张实现方法

1.os.system

http://docs.python.org/library/os.html

Python 2.5.2 (r252:60911, Jan  4 2009, 17:40:26)
[GCC 4.3.2] on linux2
Type "help", "copyright", "credits" or "license" for more information.
>>> import os
>>> os.system("date")
Wed Jun 10 19:34:23 CST 2009
0
>>>


其实是执行 linux shell 命令

$ date
Wed Jun 10 19:36:02 CST 2009


缺点:
A. os.system() 是新起一个shell去干活的,对系统的开销比较大
B. 获得输出等信息比较麻烦,不能与外部命令或工具交互
C. 无法控制,(如果调用的外部命令,挂死或者执行时间很长),主进程无法控制os.system(), 因为调用os.system(cmd) 调用进程会block, until os.system() 自己退出

2.commands
[url]
http://docs.python.org/library/commands.html[/url]

tommy@lab3:~$ python
Python 2.5.2 (r252:60911, Jan  4 2009, 17:40:26)
[GCC 4.3.2] on linux2
Type "help", "copyright", "credits" or "license" for more information.
>>> import commands
>>> dir(commands)
['__all__', '__builtins__', '__doc__', '__file__', '__name__', 'getoutput', 'getstatus', 'getstatusoutput', 'mk2arg', 'mkarg']
>>> commands.getoutput("date")
'Wed Jun 10 19:39:57 CST 2009'
>>>
>>> commands.getstatusoutput("date")
(0, 'Wed Jun 10 19:40:41 CST 2009')


优点:
A. 容易获得外部命令的输出,已经退出状态
缺点:
同os.system()中的B,C

3.subprocess

http://docs.python.org/library/subprocess.html

tommy@lab3:~$ python
Python 2.5.2 (r252:60911, Jan  4 2009, 17:40:26)
[GCC 4.3.2] on linux2
Type "help", "copyright", "credits" or "license" for more information.
>>> import subprocess
>>> dir(subprocess)
['CalledProcessError', 'MAXFD', 'PIPE', 'Popen', 'STDOUT', '__all__', '__builtins__', '__doc__', '__file__', '__name__', '_active', '_cleanup', '_demo_posix', '_demo_windows', 'call', 'check_call', 'errno', 'fcntl', 'gc', 'list2cmdline', 'mswindows', 'os', 'pickle', 'select', 'signal', 'sys', 'traceback', 'types']
>>> Popen = subprocess.Popen(["date"])
Wed Jun 10 19:48:41 CST 2009
>>> Popen.pid
24723
>>>


优点:
看文档吧,可以支持和子进程交互等等

虽然 python2.6中的subprocess模块增加了
kill()
terminate()
来控制子进程退出

但是在实际的使用过程中会发现

如果子进程并不是自己退出,而是调用 kill()/terminate() 给子进程发信退出

通过 top 或者 ps -A 看到,子进程的确是释放资源了,但是却变成了 zombie(僵尸进程)

于是分析 subprocess.py模块
1201
1202         def send_signal(self, sig):
1203             """Send a signal to the process
1204             """
1205             os.kill(self.pid, sig)
1206
1207         def terminate(self):
1208             """Terminate the process with SIGTERM
1209             """
1210             self.send_signal(signal.SIGTERM)
1211
1212         def kill(self):
1213             """Kill the process with SIGKILL
1214             """
1215             self.send_signal(signal.SIGKILL)


程序仅仅是 调用 os.kill(self.pid, sig) 向子进程发送了一个信号后,父进程并没有显示去 wait() 子进程,导致了 zombie(僵尸进程) 的生成

所以问题找到,

修改subprocess.py模块,显然不妥,
那就封装一下,

我是用这个subprocess去调用mencoder 做批量转码,所以为子进程超时,要有很好控制,

具体实现见附件

显示的封装成两个函数

1.
shell_2_tty(_cmd=cmds, _cwd=None, _timeout=10*60)
# _cmd 是要执行的外面命令行,要是一个 list, 如果是str,shell=True,会启动一个新的shell去干活的,这样,不利于进程的控制
# _cwd 是执行这个命令行前,cd到这个路径下面,这个,对我的用应很重要,如果不需要可以用默认值
# _timeout 这个是主角,设置超时时间(秒单位),从真重执行命令行开始计时,墙上时间超过 _timeout后,父进程会kill掉子进程,回收资源,并避免产生 zombie(僵尸进程)
# 并将调用的命令行输出,直接输出到stdout,即是屏幕的终端上,
(如果对输出比较讨厌,可以将 stdout = open("/dev/null", "w"), stderr=open("/dev/null"),等等)

2.
shell_2_tempfile(_cmd=cmds, _cwd=None, _timeout=10)
类同1,主要是增加,对命令行的输出,捕获,并返回给父进程,留作分析


对附件中,有不足或可以讨论的地方
联系 bychyahoo@gmail.com






1
1
分享到:
评论

相关推荐

    PyPI 官网下载 | python-subprocess-utils-0.0.1.tar.gz

    Python Subprocess Utils 是一个Python开发的后端工具库,它扩展了Python标准库中的`subprocess`模块,提供了更方便的方式来管理和控制子进程。在Python编程中,`subprocess`模块是用于创建新的进程、连接到它们的...

    Python标准库06之子进程 (subprocess包) 详解

    这里的内容以Linux进程基础和Linux文本流为基础。subprocess包主要功能是执行外部的命令和程序。...在Python中,我们通过标准库中的subprocess包来fork一个子进程,并运行一个外部的程序(fork,exec见Linux进程基础)。

    python subprocess 杀掉全部派生的子进程方法

    ### Python Subprocess 杀掉全部派生的子进程方法 #### 概述 在Python编程中,使用`subprocess`模块来执行外部命令或程序是非常常见的需求。然而,在某些场景下,我们需要能够有效地终止这些子进程及其所有派生的...

    ssh-subprocess:Python模块可通过SSH提供类似于子进程的命令执行

    ssh子进程 ssh-subprocess是一个小的Python模块,提供进程的API,用于通过SSH远程执行命令。 该模块依赖于OpenSSH的SSH功能,并且需要非交互式(例如,公钥)身份验证。 该模块还支持SCP文件传输,以上传和下载文件...

    Python库 | pytest_subprocess-1.3.1-py3-none-any.whl

    `pytest_subprocess-1.3.1-py3-none-any.whl` 是一个针对 Python 开发的测试库,主要用于在测试环境中模拟子进程。这个压缩包包含了一个预编译的 Python 轮子(wheel)文件,轮子文件是 Python 的二进制包格式,可以...

    Python 从subprocess运行的子进程中实时获取输出的例子

    在Python编程中,有时我们需要创建子进程来执行外部命令或脚本,以便于任务调度、资源管理和并发操作。`subprocess`模块是Python提供的一种强大工具,它允许我们方便地创建子进程并与其进行交互。本文将深入探讨如何...

    Python库 | subprocess-tee-0.1.tar.gz

    `subprocess-tee-0.1.tar.gz` 是一个针对Python的特定库,名为`subprocess-tee`,版本为0.1,它封装了Unix命令`tee`的功能并将其集成到Python的`subprocess`模块中。`subprocess`模块是Python用于生成新的进程、连接...

    Python库 | pytest_subprocess-0.1.3-py3-none-any.whl

    `pytest_subprocess-0.1.3-py3-none-any.whl` 是一个针对Python编程语言的第三方测试库,主要用于在测试过程中管理进程子进程。这个压缩包包含了一个Python的可分发包(wheel),它是Python软件包的一种二进制格式,...

    Python 创建子进程模块subprocess详解

    subprocess模块作为Python标准库的一部分,旨在替代一些较旧的模块和函数,包括os.system、os.spawn*、os.popen*、popen2.*和commands.*等,因此subprocess模块是进行进程创建和管理的推荐方式。 subprocess模块的...

    对Python subprocess.Popen子进程管道阻塞详解

    Python是广泛使用的高级编程语言,它内置了丰富的库,可以用来进行系统调用和管理子进程。subprocess模块是Python用来替代旧的os.system, popen2和commands模块的,它允许你从Python程序中启动新的进程,连接到它们...

    python-3.10.11-amd64

    8. **新的内置函数和模块**:例如`os.popen()`被新的`subprocess.run()`替代,提供更安全的子进程管理。 安装"python-3.10.11-amd64.exe"文件会为你的系统提供完整的Python运行环境,包括解释器、标准库以及开发...

    spring-boot-python-demo

    这可能涉及到通过Java的子进程执行Python脚本,或者使用像Jython这样的Python实现来运行Python代码直接在Java虚拟机(JVM)上。 【标签】"spring boot"指代了该项目基于Spring Boot框架,它提供了自动化配置、内嵌...

    Python快速教程-Vamei-pdf版

    - **子进程(subprocess包)**:介绍如何使用`subprocess`模块创建和控制子进程。 - **信号(signal包)**:讲解如何使用`signal`模块处理系统信号。 以上内容概述了Vamei的Python快速教程的主要知识点,这些知识点覆盖...

    cpp-subprocess:使用现代C ++进行子处理

    [C ++中的子处理]设计目标唯一的目标是在处理流程时开发与python2.7子流程模块非常接近的内容。 找不到针对C ++所做的任何类似操作,到此为止。 该库具有以下设计目标: 直观的界面。 使用现代C ++功能,在大多数...

    Python-守护进程管理基类提供守护进程创建及终止日志记录子进程管理

    这个"Python-守护进程管理基类提供守护进程创建及终止日志记录子进程管理"项目就是一个这样的工具。 首先,让我们深入理解守护进程的基本概念。在Unix-like系统中,守护进程是不与任何终端关联的进程,它们在后台...

Global site tag (gtag.js) - Google Analytics