golang webapp init.d 脚本挂起

我有一个编译为单个二进制文件的 go web 应用程序,我试图通过 init.d 管理它。这是我的 init.d 脚本:


PATH=/usr/local/sbin:/usr/local/bin:/sbin:/bin:/usr/sbin:/usr/bin

DAEMON=/usr/bin/my-go-app

DAEMON_ARGS="--logFile /var/log/my-go-app/my-go-app.log"

NAME=my-go-app

DESC=my-go-app


RUNDIR=/var/run/my-go-app

PIDFILE=$RUNDIR/my-go-app.pid


test -x $DAEMON || exit 0


if [ -r /etc/default/$NAME ]

then

        . /etc/default/$NAME

fi


. /lib/lsb/init-functions


set -e


case "$1" in

  start)

        echo -n "Starting $DESC: "

        mkdir -p $RUNDIR

        touch $PIDFILE

        chown ubuntu:ubuntu $RUNDIR $PIDFILE

        chmod 755 $RUNDIR


        if [ -n "$ULIMIT" ]

        then

                ulimit -n $ULIMIT

        fi


        if start-stop-daemon --start --quiet --umask 007 --pidfile $PIDFILE --chuid ubuntu:ubuntu --exec $DAEMON -- $DAEMON_ARGS

        then

                echo "$NAME."

        else

                echo "failed"

        fi

                ;;

  stop)

        echo -n "Stopping $DESC: "

        if start-stop-daemon --stop --retry forever/TERM/1 --quiet --oknodo --pidfile $PIDFILE --exec $DAEMON

        then

                echo "$NAME."

        else

                echo "failed"

        fi

        rm -f $PIDFILE

        sleep 1

        ;;


  restart|force-reload)

        ${0} stop

        ${0} start

        ;;


  status)

        echo -n "$DESC is "

        if start-stop-daemon --stop --quiet --signal 0 --name ${NAME} --pidfile ${PIDFILE}

        then

                echo "running"

        else

                echo "not running"

                exit 1

        fi

        ;;


  *)

        echo "Usage: /etc/init.d/$NAME {start|stop|restart|force-reload|status}" >&2

        exit 1

        ;;

esac


exit 0

问题是当我运行时service my-go-app start,它只是挂起,就像这样:


ubuntu@ip-10-0-0-40:~$ service my-go-app start

Starting my-go-app:

并且永远不会回来。在这种状态下,如果我打开一个单独的终端,我可以通过检查日志文件看到应用程序正在运行,但 /var/run/my-go-app/my-go-app.pid 中没有任何内容(尽管pid 文件确实被创建)。


有没有人遇到过(并希望解决)这个问题?如何将我的 go 应用程序作为 init.d 守护程序运行?



噜噜哒
浏览 194回答 2
2回答

宝慕林4294392

如果您使用 Upstart 运行系统,则可以使用以下脚本:start on runlevel [2345]stop on runlevel [016] or unmounting-filesystem# Replace {soft} and {hard} with the soft and hard resource limits you desire#limit nofile {soft} {hard}umask 007setuid ubuntusetgid ubuntuexec /usr/bin/my-go-app --logFile /var/log/my-go-app/my-go-app.log您还可以在您的应用程序已正确启动和初始化的地方将以下代码添加到您的守护程序中:if ("yes" == os.Getenv("MYAPP_RAISESTOP")) {    p, err := os.FindProcess(os.Getpid())    p.Signal(syscall.SIGSTOP)}以及上面新贵工作的以下内容:env MYAPP_RAISESTOP="yes"expect stop如果if () { }不是真正的 Go 语法,我很抱歉;我是一个 C 程序员哈哈(虽然 () 和 {} 里面的东西是真实的,我做了一点研究:)。执行最后一点可以确保 Upstart 在触发started事件之前等待您的应用程序正确设置。如果没有其他工作在等待您的应用程序,那么您实际上并不需要它。

绝地无双

如果你想在 Go 程序中使用 SysVinit 和 start-stop-daemon,你将需要 --background 标志。我建议改用主管或马戏团之类的东西。编辑:这并非严格正确,如果您的 Go 程序守护自己,则--background可以排除该标志。
打开App,查看更多内容
随时随地看视频慕课网APP

相关分类

Go