使用subprocess.Popen终止后台启动的SimpleHTTPServer进程

时间:2018-04-07 00:50:06

标签: python python-2.7 subprocess simplehttpserver

我想在我的脚本中杀死SimpleHTTPServer。 手动命令运行正常。

Starting SimpleHTTPServer in background:
-bash-4.2$ python -m SimpleHTTPServer 8080 &
[1] 26345

Verifying SimpleHTTPServer process:
-bash-4.2$ ps -ef | grep SimpleHTTPServer
x  26345 20169  0 17:44 pts/21   00:00:00 python -m SimpleHTTPServer 8080

Killing SimpleHTTPServer:
-bash-4.2$ kill -9 `ps -ef | grep SimpleHTTPServer | grep 8080 | awk '{print $2}'`

Verifying SimpleHTTPServer is killed or not:
-bash-4.2$ ps -ef | grep SimpleHTTPServer
x  26356 20169  0 17:45 pts/21   00:00:00 grep --color=auto SimpleHTTPServer

脚本中的相同内容无效。我正在使用subprocess.Popen

subprocess.Popen(["kill", "-9", "`ps -ef | grep SimpleHTTPServer | grep 8080 | awk '{print $2}'`"])
(Pdb++) kill: cannot find process "`ps -ef | grep SimpleHTTPServer | grep 8080 | awk '{print $2}'`"

1 个答案:

答案 0 :(得分:0)

您正试图在kill命令中围绕shell管道使用shell反引号。但是,如果没有shell=True,您就会尝试这样做。你不能这样做。

您可以构建sh命令行并使用shell=True运行该命令行,但这通常是一个坏主意。

Replacing Older Functions with the subprocess Module上的subprocess文档展示了如何在Python中使用shell执行相同的操作。这是一个更好的主意,但有点工作。

但最简单的做法就是不要调用任何这些东西。

  • 您不需要ps|grep|grep|awk来查找流程的PID,因为您Popen了该流程,因此它只是proc.pid
  • 您也不需要kill,因为您仍然拥有Popen个对象,因此您只需拨打killterminatesend_signal就可以了。