为什么systemd无法启动golang Web应用程序,没有答案

My golang web app cannot start when I use systemd, but it works fine when manually start. What are problems with my systemd configuration?

goweb.service

$ 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 is a binary file compiled with command: env GOOS=linux GOARCH=amd64 go build -v bitbucket.org/myapp/backend

systemd service status

$ 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: It looks like my web app started, but then stoped immediately.

I try config Type=forking, then service status show as below. Could someone explains why the log Started Backend service. and Starting Backend service... order is reversed.

$ 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.

Result when I run web app manually (from terminal):

$ /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

Update:

  1. I try supervisord and it works fine (same binary file)
  2. With systemd, I changed service config to Restart=always, RestartSec=15. And systemd keeps restarting my web app.

Does anyone know why supervisord work fine but systemd not? I think that systemd would work fine with a basic task like that!

I'll take a wild stab and guess your app listens on port 80 and/or 443, so your best bet is to use setcap on it to give it permission.

example: sudo setcap 'cap_net_bind_service=+ep' /u01/backend, this will need to be done every time you compile your app.

Replace your app temporarily with a minimal version that just dumps the environment out. Are the environment for running manually and under systemd sufficiently similar?

I know this is old, but saw that there weren't any sufficient answers, so thought I would post. My app was also being run manually, but when using systemd it wouldn't work. I realized it had to do with the filepaths that the Go program would state, such as:

tpl = template.Must(template.ParseGlob("templates/*"))

When running the app manually, the templates folder was there relative to my main.go file, but when systemd would run it, the filepath was different (not sure why or how to solve this yet), but for now I just hardcoded an absolute filepath, such as:

tpl = template.Must(template.ParseGlob("./home/ubuntu/templates/*"))

Now systemd works.

Hope this helps. If anyone can elaborate on how to come up with a better solution, would totally help me as well!

From @RijulSudhir comment above, insert:

WorkingDirectory=/home/ubuntu/

below:

[service]

of systemd service file.