本文讲解在使用kill pid命令关闭python脚本时,如何优雅地关闭子进程;以及如何将子进程的输出重定向到文件中
工具/原料
python 2.7
centos 7
子进程
1、子进程类主要包含两个函数,一个是启动子进程,一个是关闭子进程
2、clas衡痕贤伎ssubprocess.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)启动一个子进程,主要用到的参数就是args下面主要讲解下参数args,可以是一个字符串,也可以是一个包含程序参数的列表比如需要打开gedit程序,可以输入subprocess.Popen("/usr/bin/gedit")如果需要用gedit打开1.txt文本,如果subprocess.Popen("/usr/bin/gedit 1.txt")就会报错可以输入subprocess.Popen(["/usr/bin/gedit", "1.txt"]) 或者subprocess.Popen("/usr/bin/gedit 1.txt", shell=True)Popen.wait() 等待子进程退出
3、启动子进程函数,运行一个子进程,然后等待子进程退出
4、Popen.kill() 杀掉子进程Popen.returncode子程序的返回值,由poll()或者wait()设置,间接地也由communicate()设置。如果为None,表示子进程还没终止。如果为负数-N的话,表示子进程被N号信号终止。
5、关闭子进程函数,当子进程未退出时,杀掉子进程
信号处理
1、在程序入口,添加signal.SIGTERM信号,当捕获到信号后,关闭子进程
运行效果
1、目录结构如下
2、在命令行运行python main.py将在新窗口打开1.txt文件,命令行也处于等待的状态
3、在另一个命令行窗口查找main.py运行的pid,然后调用kill pid杀掉主程序。可以看到之前启动的子进程也一并关闭了
子进程输出到文件
1、subprocess.Popen在启动子旅邯佤践进程时,还有许多参数stdin stdout和stderr,分别表示子程序的标准脶巴躔炒输入、标准输出和标准错误。可选的值有PIPE或者一个有效的文件描述符(其实是个正整数)或者一个文件对象,还有None。这里以stdout举例默认是输出到屏幕,也可以指定到文件
2、修改main.py中,mysubpro.Run的参数为mysubpro.Run("ls")然后运行,可以看到,在命令行中输出了ls命令的结果
3、修改subproces.Popen函数,增加stdout的输出到文件中可以看到命令行中没有了ls的结果,在文件中看到了ls的结果