为了账号安全,请及时绑定邮箱和手机立即绑定

golang webapp init.d 脚本挂起

golang webapp init.d 脚本挂起

Go
噜噜哒 2021-08-10 20:38:24
我有一个编译为单个二进制文件的 go web 应用程序,我试图通过 init.d 管理它。这是我的 init.d 脚本:PATH=/usr/local/sbin:/usr/local/bin:/sbin:/bin:/usr/sbin:/usr/binDAEMON=/usr/bin/my-go-appDAEMON_ARGS="--logFile /var/log/my-go-app/my-go-app.log"NAME=my-go-appDESC=my-go-appRUNDIR=/var/run/my-go-appPIDFILE=$RUNDIR/my-go-app.pidtest -x $DAEMON || exit 0if [ -r /etc/default/$NAME ]then        . /etc/default/$NAMEfi. /lib/lsb/init-functionsset -ecase "$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        ;;esacexit 0问题是当我运行时service my-go-app start,它只是挂起,就像这样:ubuntu@ip-10-0-0-40:~$ service my-go-app startStarting my-go-app:并且永远不会回来。在这种状态下,如果我打开一个单独的终端,我可以通过检查日志文件看到应用程序正在运行,但 /var/run/my-go-app/my-go-app.pid 中没有任何内容(尽管pid 文件确实被创建)。有没有人遇到过(并希望解决)这个问题?如何将我的 go 应用程序作为 init.d 守护程序运行?
查看完整描述

2 回答

?
宝慕林4294392

TA贡献2021条经验 获得超8个赞

如果您使用 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 007


setuid ubuntu

setgid ubuntu


exec /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事件之前等待您的应用程序正确设置。如果没有其他工作在等待您的应用程序,那么您实际上并不需要它。


查看完整回答
反对 回复 2021-08-10
?
绝地无双

TA贡献1946条经验 获得超4个赞

如果你想在 Go 程序中使用 SysVinit 和 start-stop-daemon,你将需要 --background 标志。

我建议改用主管马戏团之类的东西。

编辑:

这并非严格正确,如果您的 Go 程序守护自己,则--background可以排除该标志。


查看完整回答
反对 回复 2021-08-10
  • 2 回答
  • 0 关注
  • 193 浏览
慕课专栏
更多

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信