续上一篇 《Docker+Alpine简单的多进程启动》。
实现了一个docker内2个进程后,发现一个小问题,容器的重启或停止,都需要等10秒,虽然没影响但也很难受。
查了一下原理,大概是停止容器时docker会往进程发送结束指令,如果没有顺利结束,10秒后强行结束。
这种情况下如果用supervisor就可以解决,它可以接受指令,并关闭自己启动了的服务、进程(我没有测试过)。
本着探索精神,还是决定尝试脚本解决,最后使用以下脚本实现:
1 2 3 |
#!/bin/sh /usr/sbin/crond -f & exec /usr/sbin/lighttpd -D -f /etc/lighttpd/lighttpd.conf |
和原来的其实差不多:
1 2 3 |
#!/bin/sh /usr/sbin/lighttpd -D -f /etc/lighttpd/lighttpd.conf & /usr/sbin/crond -f |
区别在于,新脚本启动后,crond变成了lighttpd的子进程,所以当docker stop的时候,lighttpd可以处理掉自己下面的子进程,顺利退出。
这样,docker stop确实就很快了。但是我不确定这样的形式下crond在Lighttpd出现异常时能否正常的执行计划任务。目前到现在一切正常(我的场景是使用crond跑logrotate的计划任务,切割log文件)