docker 定时重启脚本_使用 Go 添加启动脚本
- 簡(jiǎn)介
- 實(shí)踐
- 困惑
- 總結(jié)
- 當(dāng)前部分的代碼
簡(jiǎn)介
雖然 Makefile 能很好的整合各種命令, 是一個(gè)非常方便的工具. 但啟動(dòng)腳本也是必不可少的, Makefile 更多用于開(kāi)發(fā)階段, 比如編譯, 單元測(cè)試等流程.
啟動(dòng)腳本的作用是控制程序的狀態(tài), 管理程序的啟動(dòng), 停止, 查詢運(yùn)行狀態(tài)等.
實(shí)踐
直接上腳本了:
#!/bin/bashSERVER="web" BASE_DIR=$PWD INTERVAL=2# 命令行參數(shù),需要手動(dòng)指定, 這是在 docker 容器中運(yùn)行的參數(shù) ARGS="-c $BASE_DIR/conf/config_docker.yaml"function start() {if [ "`pgrep $SERVER -u $UID`" != "" ];thenecho "$SERVER already running"exit 1finohup $BASE_DIR/$SERVER $ARGS >/dev/null 2>&1 &echo "sleeping..." && sleep $INTERVAL# check statusif [ "`pgrep $SERVER -u $UID`" == "" ];thenecho "$SERVER start failed"exit 1elseecho "start success"fi }function status() {if [ "`pgrep $SERVER -u $UID`" != "" ];thenecho $SERVER is runningelseecho $SERVER is not runningfi }function stop() {if [ "`pgrep $SERVER -u $UID`" != "" ];thenkill `pgrep $SERVER -u $UID`fiecho "sleeping..." && sleep $INTERVALif [ "`pgrep $SERVER -u $UID`" != "" ];thenecho "$SERVER stop failed"exit 1elseecho "stop success"fi }function version() {$BASE_DIR/$SERVER $ARGS version }case "$1" in'start')start;;'stop')stop;;'status')status;;'restart')stop && start;;'version')version;;*)echo "usage: $0 {start|stop|restart|status|version}"exit 1;; esac用法如下:
- ./admin.sh start 啟動(dòng)
- ./admin.sh stop 停止
- ./admin.sh restart 重啟
- ./admin.sh status 查看狀態(tài)
- ./admin.sh version 查看版本
困惑
在運(yùn)行啟動(dòng)腳本的過(guò)程中遇到了一個(gè)問(wèn)題, 就是使用腳本 stop 進(jìn)程的時(shí)候, 進(jìn)程會(huì)變成僵尸進(jìn)程(Zombies), 而不是正常停止.
但如果不使用 nohup, 直接在前臺(tái)運(yùn)行, 然后在另一個(gè)終端中關(guān)閉, 是會(huì)關(guān)閉的.
這個(gè)問(wèn)題困擾了我很久, 直到看到 stackoverflow 上的 類似問(wèn)題.
這是在評(píng)論中發(fā)現(xiàn)的, 有時(shí)候豁然開(kāi)朗就在一瞬間,
If you're running the process (even if you've called wait finally) inside the docker container with pid:1, it will also lead to a zombie. http://github.com/krallin/tiniwill be helpful in this case. – McKelvin Mar 8 '17 at 11:34只要在 docker-compose 中設(shè)置 init 為 true 就行了, 類似這樣:
version: "3.7" services:web:image: alpine:latestinit: true這會(huì)在 docker 容器內(nèi)運(yùn)行一個(gè) init 來(lái)轉(zhuǎn)發(fā)信號(hào), 默認(rèn)的 init 程序就是上面提到的 Tini.
這是在使用 容器開(kāi)發(fā) 時(shí)遇到的問(wèn)題.
總結(jié)
啟動(dòng)腳本是一個(gè)非常方便的工具, 用于管理進(jìn)程的啟動(dòng)和停止.
當(dāng)前部分的代碼
作為版本 v0.13.0
總結(jié)
以上是生活随笔為你收集整理的docker 定时重启脚本_使用 Go 添加启动脚本的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。
- 上一篇: Cs代码写在html页面哪里,当用于在d
- 下一篇: MATLAB之输出