用subprocess启动后台进程

2020年6月24日 / 291次阅读 / Last Modified 2020年6月24日
subprocess模块多进程

先说一下自己对Python的subprocess模块和multiprocessing模块不一样地方的理解吧。

subprocess是使用一行shell命令来启动进程,同步异步都可以。multiprocessing是用一个代码入口启动进程,并提供了更加丰富的进程间信息交互和同步的方式。

我有一个需求,是需要在python代码中,直接创建一个后台进程,不能因为Ctrl-C或者关闭shell窗口,使这个后台进程退出。在multiprocessing模块中找了一圈,没有发现相关的接口,不过subprocess模块帮我实现了这一个需求。

因为subprocess模块是用调用shell命令的方式创建进程,我们可以直接用这一行shell命令启动后台进程。

$ cat test.py
import subprocess
subprocess.Popen('python3.8 start.py', shell=True)

如上示例,test.py的执行,就是启动一个新的python进程,然后自己就退出了。这个新的python进程,就成了后台进程,logout后也依然存在。这个命令行,连nohup都不需要!

不过,有个小细节,用这种方式启动的后台进程,父进程是一个sh,sh上面就是systemd:

$ pstree
systemd─┬─2*[agetty]
        ├─alsactl
        ├─avahi-daemon───avahi-daemon
        ├─bluetoothd
        ├─cron
        ├─dbus-daemon
        ├─dhcpcd
        ├─hciattach
        ├─rngd───3*[{rngd}]
        ├─rsyslogd───3*[{rsyslogd}]
        ├─sh───python3.8─┬─python3.8
        │                └─{python3.8}
        ├─sshd───sshd───sshd───bash───pstree
        ├─systemd───(sd-pam)
        ├─systemd-journal
        ├─systemd-logind
        ├─systemd-timesyn───{systemd-timesyn}
        ├─systemd-udevd
        ├─thd
        └─2*[wpa_supplicant]

-- EOF --

本文链接:https://www.pynote.net/archives/2088

留言区

电子邮件地址不会被公开。 必填项已用*标注


前一篇:
后一篇:

More


©Copyright 麦新杰 Since 2019 Python笔记

go to top