AberSheeran
Aber Sheeran
I know nothing except the fact of my ignorance.

os.system在Docker中的坑

起笔自
所属文集: 杂记
共计 738 个字符
落笔于

最近在忙项目的同时,也想把自己的小工具用自己的index.py重写一下。一是为了从实践中完善index.py,二是像这种需要频繁修改后端代码的网站,用index.py比较爽。

但在尝试使用docker运行index.py的时候,出了问题。

问题

众所周知,docker容器在正常终止时会向主进程(pid 1)发送一个SIGTERM信号。一般来说,程序是能正常接收这个信号,并且退出的。

但……在index.py中偏偏不行!

原因

众所周知,Python的os.system调用的是C函数system

它的执行过程可以用三个词概括:fork、exec、wait。

这里会出现一个问题,它不仅会阻塞调用它的程序,并且在所执行的程序执行完成之前,在Python里处理信号的程序将不会被调用。

解决

于是,如何解决,清晰明了。

import signal
import subprocess

def exec(*command):
    process = subprocess.Popen(*command, shell=True)

    def sigterm_handler(signo, frame):
        process.terminate()
        process.wait()
        sys.exit(0)

    signal.signal(signal.SIGTERM, sigterm_handler)

    while process.poll() is None:
        time.sleep(1)

反思

不要滥用os.system,尽量以subprocess代替。

Python官方诚不欺我。😭

如果你觉得本文值得,不妨赏杯茶
加速Python的asyncio
没有下一篇