我有一个使用Python3的Flask应用程序。有时它会创建守护进程来运行脚本,然后当超时时(使用signal.SIGINT
)我想要杀死守护进程。
但是,一些由os.system
创建的进程(例如os.system('git clone xxx')
)在守护进程被杀死后仍然在运行。
那么我该怎么办呢?非常感谢!
os.system
无法提供它,只返回子进程的返回值。新的subprocess
模块提供了更多的控制,但相应地也更加复杂。特别的,它允许你等待进程完成,并在需要时设置超时时间,同时也给你访问子进程pid的权限。虽然我不是它的专家,但它似乎很好用。请注意,这段代码需要使用Python 3.3或更高版本才能使用Popen.wait
调用的timeout
参数。import subprocess
process = subprocess.Popen(['git', 'clone', 'https://github.com/username/reponame'])
try:
print('Running in process', process.pid)
process.wait(timeout=10)
except subprocess.TimeoutExpired:
print('Timed out - killing', process.pid)
process.kill()
print("Done")
$ ps aux | grep -i python
username 6488 0.0 0.0 2434840 712 s003 R+ 1:41PM 0:00.00 python
6488
是PID,即进程标识符。查看您机器上的命令输出以找到您想要终止的进程的PID。$ kill 6488
sudo
。但要小心,不要杀错东西,否则会发生糟糕的事情!
os.system()
而不是subprocess
调用有什么特别的原因吗?后者可以让你更好地控制创建的子进程。 - tripleeesubprocess
模块相对较为晦涩,而使用os.system
的示例仍然存在很多。尽管其文档中写道 "subprocess 模块提供了更强大的功能来生成新进程并检索它们的结果",但只有在阅读文档后才能知道这一点... - holdenweb