linux安装服务程序,将 Go 程序安装成系统服务
在 Go 語言開發(fā)的程序部署到 Linux 服務器 這篇文章中提到了讓應用程序在后臺運行的方法,這篇文章講的是如何將 Go 程序安裝成系統(tǒng)服務(這篇文章中主要講的 Windows 系統(tǒng) 和 Linux/(systemd) 系統(tǒng))。
代碼實現(xiàn)
最簡單的方式是使用 github.com/kardianos/service 這個庫,它支持 Windows XP+,Linux/(systemd | Upstart | SysV),和OSX/Launchd。使用示例如下:package main
import (
"log"
"github.com/kardianos/service"
)
var logger service.Logger
type program struct{}
func (p *program) Start(s service.Service) error {
// Start should not block. Do the actual work async.
go p.run()
return nil
}
func (p *program) run() {
// Do work here
}
func (p *program) Stop(s service.Service) error {
// Stop should not block. Return with a few seconds.
return nil
}
func main() {
svcConfig := &service.Config{
Name: "GoServiceExampleSimple",
DisplayName: "Go Service Example",
Description: "This is an example Go service.",
}
prg := &program{}
s, err := service.New(prg, svcConfig)
if err != nil {
logs.Error("創(chuàng)建服務失敗,", err)
return
}
if len(os.Args) > 1 {
if os.Args[1] == "install" {
err := s.Install()
if err != nil {
logs.Error("服務安裝失敗,", err)
} else {
logs.Info("服務安裝成功")
}
return
}
if os.Args[1] == "uninstall" {
err := s.Uninstall()
if err != nil {
logs.Error("服務卸載失敗,", err)
} else {
logs.Info("服務卸載成功")
}
return
}
if os.Args[1] == "start" {
err := s.Start()
if err != nil {
logs.Error("啟動服務失敗,", err)
} else {
logs.Info("啟動服務成功")
}
return
}
if os.Args[1] == "stop" {
err := s.Stop()
if err != nil {
logs.Error("停止服務失敗,", err)
} else {
logs.Info("停止服務成功")
}
return
}
}
logs.Info("服務正在啟動...")
err = s.Run()
if err != nil {
logs.Error("服務運行失敗,", err)
return
}
logs.Info("服務正常停止")
}
如上面的代碼,編譯程序后可以在控制臺使用 ./your-service 命令直接執(zhí)行程序。如果想集成服務可以使用 ./your-service install 命令安裝服務,使用 ./main uninstall 命令卸載服務,使用 ./your-service start 命令啟動服務,使用 ./your-service stop 命令停止服務。
在 Windows 平臺,可以運行 services.msc 查看服務啟動及運行情況。
在 Linux 平臺,執(zhí)行 ./main install 命令安裝服務后會生成一個 /etc/systemd/system/.service 文件(systemd )。可以使用 systemctl | grep your-service 查看服務是否已安裝。
當然你也可以使用 service your-service start啟動服務、使用 service your-service stop 停止服務、使用service your-service status命令查看服務運行狀態(tài)及啟動錯誤信息。如果想要開機啟動,可以使用service your-service enable 命令。
Linux systemd 集成
我使用 systemd 來集成 Golang 程序作為一個系統(tǒng)服務的方法如下:
首先新建 systemd 的 service。假設(shè)程序放到 /usr/local/bin 目錄,首先新建 service 文件,名稱叫做 your-service:touch /etc/systemd/system/your-service.service
第二步,編輯該文件,輸入的內(nèi)容如下[Unit]
Description=服務描述
[Service]
Type=simple
Restart=always
RestartSec=5s
ExecStart=/usr/local/bin/your-service-dir/your-service
WorkingDirectory=/usr/local/bin/your-service-dir/
[Install]
WantedBy=multi-user.target
其中 ExecStart 是 Go 可執(zhí)行文件的路徑。WorkingDirectory 要注意,如果程序中使用了相對路徑來加載一些配置文件,如果在 service 中沒有配置 WorkingDirectory ,則默認是根路徑,所以配置文件就從根路徑來尋找,會造成一些意想不到的情況。當然你也可以在程序中使用如下代碼指定運行目錄:func main() {
// 更改程序目錄 changed path for service
path, err := os.Executable()
if err != nil {
return
}
dir, err := filepath.Abs(filepath.Dir(path))
if err != nil {
return
}
err = os.Chdir(dir)
if err != nil {
return
}
// you code
}
最后就可以使用上面提到的命令 service your-service start啟動服務、使用 service your-service stop 停止服務、使用service your-service status命令查看服務運行狀態(tài)及啟動錯誤信息。如果想要開機啟動,可以使用service your-service enable 命令。
總結(jié)
以上是生活随笔為你收集整理的linux安装服务程序,将 Go 程序安装成系统服务的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: android启动页面显示空白,andr
- 下一篇: HTML+CSS+JS实现 ❤️3D万花