在扭曲脚本上终止 SIGTERM 上的 docker 容器
Terminating docker container on SIGTERM on warping script
我有以下 Python 扭曲 docker 容器的脚本 运行:
import subprocess
import sys
import signal
container_id = None
def catch_term(signum, frame):
sys.stderr.write('Caught SIGTERM. Stopping container\n')
if container_id != None:
cmd = ['docker', 'rm', '-f', container_id]
subprocess.call(cmd)
sys.exit(143)
signal.signal(signal.SIGTERM, catch_term)
cmd = ['docker', 'run', '--cidfile', cidfile, '-i', image_name, container_process_cmd]
p = subprocess.Popen(cmd)
# This function waits for the file to contain 64 bytes and then reads the container id from it
container_id = get_container_id_from_cidfile(cidfile)
p.communicate()
sys.exit(p.returncode)
当我在交互模式下 运行 Python 进程,并在 运行 (kill <PID>
) 期间终止那个变形脚本,catch_term
函数被调用并且容器被移除。然后我的进程退出。
但是,当我运行在后台进行warping进程,即my_warping_script_above.py &
,然后kill同样,catch_term
函数根本没有被调用,我的脚本保持 运行ning,包括容器。
知道如何让 catch_term
函数在后台运行脚本 运行 时被调用吗?
我认为这与docker run
是一个"protected"过程有关。它应该只能使用 docker 命令被杀死,例如 docker rm -f <CONTAINER ID>
,或者如果使用 -i
调用则使用 Ctrl+C
。这就是为什么我试图捕捉 TERM 信号并调用 docker rm
,但是当脚本 运行s 在后台时我的函数没有被调用的原因......(我认为它试图首先杀死子进程,然后当它失败时,它没有到达调用我注册的函数的阶段)。
自己回答:
这个技巧解决了我的问题:将 preexec_fn=os.setsid
添加到 subprocess.Popen
函数:
p = subprocess.Popen(cmd, preexec_fn=os.setsid)
我有以下 Python 扭曲 docker 容器的脚本 运行:
import subprocess
import sys
import signal
container_id = None
def catch_term(signum, frame):
sys.stderr.write('Caught SIGTERM. Stopping container\n')
if container_id != None:
cmd = ['docker', 'rm', '-f', container_id]
subprocess.call(cmd)
sys.exit(143)
signal.signal(signal.SIGTERM, catch_term)
cmd = ['docker', 'run', '--cidfile', cidfile, '-i', image_name, container_process_cmd]
p = subprocess.Popen(cmd)
# This function waits for the file to contain 64 bytes and then reads the container id from it
container_id = get_container_id_from_cidfile(cidfile)
p.communicate()
sys.exit(p.returncode)
当我在交互模式下 运行 Python 进程,并在 运行 (kill <PID>
) 期间终止那个变形脚本,catch_term
函数被调用并且容器被移除。然后我的进程退出。
但是,当我运行在后台进行warping进程,即my_warping_script_above.py &
,然后kill同样,catch_term
函数根本没有被调用,我的脚本保持 运行ning,包括容器。
知道如何让
catch_term
函数在后台运行脚本 运行 时被调用吗?我认为这与
docker run
是一个"protected"过程有关。它应该只能使用 docker 命令被杀死,例如docker rm -f <CONTAINER ID>
,或者如果使用-i
调用则使用Ctrl+C
。这就是为什么我试图捕捉 TERM 信号并调用docker rm
,但是当脚本 运行s 在后台时我的函数没有被调用的原因......(我认为它试图首先杀死子进程,然后当它失败时,它没有到达调用我注册的函数的阶段)。
自己回答:
这个技巧解决了我的问题:将 preexec_fn=os.setsid
添加到 subprocess.Popen
函数:
p = subprocess.Popen(cmd, preexec_fn=os.setsid)