python子进程中的子shell

Posted

技术标签:

【中文标题】python子进程中的子shell【英文标题】:Subshell in python subprocess 【发布时间】:2018-06-09 23:44:34 【问题描述】:

在 python 脚本中,我需要启动一个命令,例如

kill $(ps aux | grep httpd | awk 'print $2')

使用子流程 我尝试使用https://***.com/a/29755431/1355628中的函数拆分命令

该函数可以使用带有管道的简单命令,但不幸的是,上面的命令似乎不起作用(返回码似乎是完全随机的......)

先谢谢了

【问题讨论】:

你的最终目标是什么,你想用python杀死一个正在运行的进程吗? 我需要处理多种方式来停止进程。有时一个简单的“服务 xxx 停止”就可以了,但对于某些进程来说还不够(需要杀死) 【参考方案1】:

subprocess.run 采用可选的shell=True 参数,它将在子shell 中运行您的命令。 但是,如果您正在处理用户输入,请务必阅读 Security Considerations。

另一个(更好的,imo)解决方案是使用psutil 包和os.kill,如下所示:

import psutil
processes = [p for p in psutil.pids() if 'httpd' in psutil.Process(p).name()]
for process in processes:
    os.kill(...)

【讨论】:

我尝试过类似的方法:cmd = "kill $(ps aux | grep proces[s] | awk 'print $2');rm -f /var/lock/process && service process start" pop = subprocess.Popen(cmd, stderr=subprocess.STDOUT, stdout=subprocess.PIPE, shell=True) pop.wait() print "return code is : %d" % pop.returncode 在 bash 中执行命令很好,但在 python 中会导致失败:“返回码是 -15”(而不是 0)

以上是关于python子进程中的子shell的主要内容,如果未能解决你的问题,请参考以下文章

如何在python的子进程中执行一组语句?

Python编写守护进程程序

views.py 中的子进程不起作用

通过不使用通信的子进程捕获输出

Python中的子进程是啥? [关闭]

杀死运行系统 shell 命令的子进程