主进程没有被阻塞时如何保持Kubernetes pod运行?
我有一个后缀pod,我想保持运行,只要我有我的整个群集。 问题是,“开始”命令:
postfix start
是非阻塞的,意味着它一旦成功发射命令就立即退出。 据我所知,这是启动postfix的唯一方法。
Docker的工作方式是一旦主进程退出,它就会退出容器。 所以,当postfix start
返回的时候,Docker会假设整个容器完成了它的事情并closures它,即使这个命令触发了其他进程。
我如何防止这种情况发生? 我能想到的唯一解决方法是postfix start && sleep infinity
但是这看起来很诡异。 如果可能的话,我想避免睡眠无限。 有没有其他的方式来启动阻塞的后缀?
你需要使用一个自定义的CMD脚本,它在postfix start
命令之后保持在前台。
比如你可以用这个,从这里拿走:
#!/bin/bash # Wait before postfix is really started. function get_state { echo $(script -c 'postfix status' | grep postfix/postfix-script) } postfix start echo $(get_state) while true; do state=$(get_state) if [[ "$state" != "${state/is running/}" ]]; then PID=${state//[^0-9]/} if [[ -z $PID ]]; then continue fi if [[ ! -d "/proc/$PID" ]]; then echo "Postfix proces $PID does not exist." break fi else echo "Postfix is not running." break fi done
该脚本持续运行一个while循环,直到postfix进程结束,并在进程退出时退出。 这样你就可以正确地停止你的容器,如果postfix由于某种原因死亡的话。