捕获信号 SIGTERM?

Parry提问于 2018-01-22 09:12
1 个回答
  • 4042018-01-22 15:55

    容器在重启和删除时会向容器中的主进程(PID 为1)发送 SIGTERM 信号,可以在主进程中捕获此信号,然后做相应的处理。 


    本示例中当捕获到 SIGTERM 信号时访问 nginx,查看 nginx 的 access.log 中是否有被测容器的访问信息即可知晓是否捕获到 SIGTERM 信号,具体步骤如下: 

    (1) 部署 使用官网镜像新建 nginx 容器服务,绑定弹性公网 IP ,假设 IP 为 59.111.90.8。 捕获 SIGTERM 信号的代码文件 sig.py 内容如下: 

    # -*- coding: utf-8 -*- import os import signal from time import sleep def onsignal_term(a,b): print '收到SIGTERM信号' os.system(""curl 59.111.90.8"") #信号处理函数,将SIGTERM绑定在函数onsignal_term上面 signal.signal(signal.SIGTERM,onsignal_term) def onsignal_usr1(a,b): print '收到SIGUSR1信号' #信号处理函数,将SIGUSR1绑定在函数onsignal_term上面 signal.signal(signal.SIGUSR1,onsignal_usr1) while 1: print '进程id是:',os.getpid() sleep(10) 只需要将 sig.py 中的 IP 改为自己 nginx 的 IP,其他部分不需修改。 书写 Dockerfile 文件,将 python sig.py 作为第一个启动命令,即主进程,示例 Dockerfile 内容如下: FROM hub.c.163.com/public/centos:6.7-tools ADD sig.py /root/sig.py ENTRYPOINT python /root/sig.py 利用此 Dockerfile 构建镜像,并新建服务,如 service1。 

    (2) 测试 重启服务 servcie1,查看 nginx 容器 /var/log/nginx/access.log 文件中是否有 servcie1 访问信息,如果有则捕获到了 SIGTERM 信号。 清除 access.log 中 service1 的访问信息,删除容器 service1,查看 nginx 的 access.log 中是否有 service1 的访问信息,如果有则捕获到信号 SIGTERM。"