我正在尝试将 go 二进制文件作为systemd
服务运行。我有其他具有相同配置的文件,它们运行良好。但我不知道我是否错过了什么。这是我的单元文件:
[Unit]
Description=my service app
[Install]
WantedBy=multi-user.target
[Service]
Type=simple
ExecStart=/root/go/myservice/bin/binary
Environment="ENV=prod"
# I have more environment variables which I've commented to test If this was the problem but isn't
Restart=always
RestartSec=5
StandardOutput=journal
StandardError=journal
SyslogIdentifier=%n
systemctl daemon-reload
我对单元文件所做的每次更改之后也都进行了运行,但行为相同。
journalctl -xefu
这是我在 systemd 服务上运行时的输出结果
Feb 21 08:55:06 myhost.com myunitfile.service[1641023]: 2023/02/21 08:55:06 exec.Command: exit status 128
Feb 21 08:55:06 myhost.com systemd[1]: myunitfile.service: Main process exited, code=exited, status=1/FAILURE
░░ Subject: Unit process exited
░░ Defined-By: systemd
░░ Support: https://www.debian.org/support
░░
░░ An ExecStart= process belonging to unit myunitfile.service has exited.
░░
░░ The process' exit code is 'exited' and its exit status is 1.
然后当我手动运行它时:/root/go/myservice/bin/executable
# /root/go/myservice/bin/executable
09:00:31.041705 server is up
编辑 2023-02-21 21:42
我最近尝试了一些事情:
我进入了存储单元文件cd
的目录/etc/systemd/system
。然后我尝试通过绝对路径运行二进制文件,但出现了同样的错误exec.Command: exit status 128
。
可能是某些权限错误?我不确定如何检查。希望得到帮助 :)
编辑 2023-02-22 15:23
我忘了说我正在部署一个使用 的 go 应用程序gRPC
。我认为这可能是问题所在。我有其他使用go build
命令构建的 go 应用程序,它们运行良好,没有任何问题。
答案1
作为一个临时补丁,我决定创建一个非常简单的 bash 脚本:
#!/bin/bash
cd /root/go/myservice
./bin/binary
我的单元文件现在如下所示:
[Unit]
Description=my service app
[Install]
WantedBy=multi-user.target
[Service]
Type=simple
ExecStart=/root/go/myservice/bin/binary
Environment="ENV=prod"
Restart=always
RestartSec=5
StandardOutput=journal
StandardError=journal
SyslogIdentifier=%n