我有服务文件,用于启动和停止自己编写的代理服务器。
[Unit]
Description=Golang proxy server in Docker
After=network.target docker.service
Requires=docker.service
[Service]
Type=simple
WorkingDirectory=/home/ooolledj/socks5-proxy
ExecStart=/usr/bin/docker container rm goproxy --force ; /usr/bin/docker run --name goproxy -p 12345:12345 goproxy:local
ExecStop=/usr/bin/docker container stop -t 1 goproxy
Restart=on-failure
TimeoutStartSec=10
[Install]
WantedBy=multi-user.target
它工作正常,除非我必须调用
systemctl stop goproxy
- 容器停止,服务处于“失败”状态。之后,我可以拨打 systemctl start goproxy
并且服务处于“活动(运行)”状态,没有任何问题。我想发生这种情况是因为容器进程(PID)死亡,守护进程看到,容器进程退出并引发错误goproxy.service: Main process exited, code=exited, status=2/INVALIDARGUMENT
。
root@my-test-host:/home/ooolledj/socks5-proxy# systemctl status goproxy
● goproxy.service - Golang proxy server in Docker
Loaded: loaded (/etc/systemd/system/goproxy.service; disabled; vendor preset: enabled)
Active: failed (Result: exit-code) since Thu 2023-08-17 18:05:09 MSK; 881ms ago
Process: 49618 ExecStartPre=/usr/bin/docker container rm goproxy --force (code=exited, status=0/SUCCESS)
Process: 49624 ExecStart=/usr/bin/docker run --name goproxy -p 12345:12345 goproxy:local (code=exited, status=2)
Process: 49717 ExecStop=/usr/bin/docker container stop -t 3 goproxy (code=exited, status=0/SUCCESS)
Main PID: 49624 (code=exited, status=2)
CPU: 135ms
Aug 17 18:04:58 my-test-host systemd[1]: Starting Golang proxy server in Docker: https://github.com/OOOlledj/socks5-proxy...
Aug 17 18:04:58 my-test-host docker[49618]: goproxy
Aug 17 18:04:58 my-test-host systemd[1]: Started Golang proxy server in Docker: https://github.com/OOOlledj/socks5-proxy.
Aug 17 18:05:09 my-test-host systemd[1]: Stopping Golang proxy server in Docker: https://github.com/OOOlledj/socks5-proxy...
Aug 17 18:05:09 my-test-host docker[49717]: goproxy
Aug 17 18:05:09 my-test-host systemd[1]: goproxy.service: Main process exited, code=exited, status=2/INVALIDARGUMENT
Aug 17 18:05:09 my-test-host systemd[1]: goproxy.service: Failed with result 'exit-code'.
Aug 17 18:05:09 my-test-host systemd[1]: Stopped Golang proxy server in Docker: https://github.com/OOOlledj/socks5-proxy.
您能否建议如何使服务在停止或其他情况下进入“退出”状态?服务失败是不正确的——它所做的一切都绝对正确。
我尝试了 ExecStop、ExecStart 和 ExecStartPre 的许多选项,但没有得到积极的结果。
解决方案非常简单 - 将代码添加到主函数中以处理退出代码为 0 的任何信号:
func main() {
sigc := make(chan os.Signal, 1)
signal.Notify(sigc,
syscall.SIGHUP,
syscall.SIGINT,
syscall.SIGTERM,
syscall.SIGQUIT)
go func() {
_ = <-sigc
os.Exit(0)
}()
// working code below
...
}
现在我的服务停止了,状态如
Active: inactive (dead)