首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >为什么systemd不能启动golang web应用程序,没有答案

为什么systemd不能启动golang web应用程序,没有答案
EN

Stack Overflow用户
提问于 2016-05-18 11:04:00
回答 5查看 3.3K关注 0票数 3

当我使用systemd时,我的golang web应用程序无法启动,但手动启动时它可以正常工作。我的系统配置有什么问题?

goweb.service

代码语言:javascript
复制
$ cat goweb.service 
[Unit]
Description=Backend service
After=network.target

[Service]
User=myapp
Group=myapp
Restart=on-failure
ExecStart=/u01/backend

[Install]
WantedBy=multi-user.target

backend是使用命令:env GOOS=linux GOARCH=amd64 go build -v bitbucket.org/myapp/backend编译的二进制文件。

系统服务状态

代码语言:javascript
复制
$ sudo service goweb status
Redirecting to /bin/systemctl status  goweb.service
● goweb.service - Backend service
   Loaded: loaded (/usr/lib/systemd/system/goweb.service; disabled; vendor preset: disabled)
   Active: inactive (dead)

May 18 10:55:56 instance-1 systemd[1]: Started Backend service.
May 18 10:55:56 instance-1 systemd[1]: Starting Backend service...

P/S:看上去我的网络应用程序启动了,但很快就停止了。

我尝试配置Type=forking,然后显示服务状态,如下所示。有人能解释为什么日志Started Backend service.Starting Backend service...顺序被颠倒了吗?

代码语言:javascript
复制
$ sudo service goweb status
Redirecting to /bin/systemctl status  goweb.service
● goweb.service - Backend service
   Loaded: loaded (/usr/lib/systemd/system/goweb.service; enabled; vendor preset: disabled)
   Active: inactive (dead) since Wed 2016-05-18 11:06:02 UTC; 2s ago
  Process: 25847 ExecStart=/u01/backend (code=exited, status=0/SUCCESS)

May 18 11:06:02 instance-1 systemd[1]: Starting Backend service...
May 18 11:06:02 instance-1 systemd[1]: Started Backend service.

结果当我手动运行web应用程序时(从终端):

代码语言:javascript
复制
$ /u01/backend
[GIN-debug] [WARNING] Running in "debug" mode. Switch to "release" mode in production.
 - using env:   export GIN_MODE=release
 - using code:  gin.SetMode(gin.ReleaseMode)

[GIN-debug] POST   /upload                   --> main.uploadFileHandler (3 handlers)
[GIN-debug] Environment variable PORT="9005"
[GIN-debug] Listening and serving HTTP on :9005

更新

  1. 我尝试了监督d,它工作得很好(相同的二进制文件)
  2. 使用systemd,我将服务配置更改为Restart=alwaysRestartSec=15systemd继续重启我的网络应用程序。

有人知道为什么supervisord工作得很好,但systemd却不行吗?我认为systemd可以很好地完成这样的基本任务!

EN

回答 5

Stack Overflow用户

发布于 2016-05-18 11:51:12

我会疯狂地尝试一下,猜你的应用程序会在端口80和/或443上监听,所以你最好的选择是在上面使用setcap来允许它。

示例:sudo setcap 'cap_net_bind_service=+ep' /u01/backend,每次编译应用程序时都需要这样做。

票数 5
EN

Stack Overflow用户

发布于 2017-04-12 20:06:08

我知道这是旧的,但看到没有足够的答案,所以我想我会张贴。我的应用程序也是手动运行的,但是当使用systemd时,它就不能工作了。我意识到这与Go程序将声明的文件有关,例如:

代码语言:javascript
复制
tpl = template.Must(template.ParseGlob("templates/*"))

在手动运行应用程序时,模板文件夹相对于我的main.go文件是存在的,但是当systemd运行它时,文件路径是不同的(还不确定为什么或者如何解决这个问题),但是现在我只是硬编码了一个绝对文件,例如:

代码语言:javascript
复制
tpl = template.Must(template.ParseGlob("./home/ubuntu/templates/*"))

现在系统开始工作了。

希望这能有所帮助。如果有人能详细说明如何想出一个更好的解决方案,也会对我有帮助的!

票数 5
EN

Stack Overflow用户

发布于 2018-11-19 14:38:13

从上面的@RijulSudhir注释,插入:

代码语言:javascript
复制
WorkingDirectory=/home/ubuntu/

如下所示:

代码语言:javascript
复制
[service]

系统服务文件的。

票数 5
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/37297714

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档