linux安装服务程序,将 Go 程序安装成系统服务

在 Go 语言开发的程序部署到 Linux 服务器 这篇文章中提到了让应用程序在后台运行的方法,这篇文章讲的是如何将 Go 程序安装成系统服务(这篇文章中主要讲的 Windows 系统 和 Linux/(systemd) 系统)。

代码实现

最简单的方式是使用 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("创建服务失败,", 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 命令直接执行程序。如果想集成服务可以使用 ./your-service install 命令安装服务,使用 ./main uninstall 命令卸载服务,使用 ./your-service start 命令启动服务,使用 ./your-service stop 命令停止服务。

在 Windows 平台,可以运行 services.msc 查看服务启动及运行情况。

在 Linux 平台,执行 ./main install 命令安装服务后会生成一个 /etc/systemd/system/.service 文件(systemd )。可以使用 systemctl | grep your-service 查看服务是否已安装。

当然你也可以使用 service your-service start启动服务、使用 service your-service stop 停止服务、使用service your-service status命令查看服务运行状态及启动错误信息。如果想要开机启动,可以使用service your-service enable 命令。

Linux systemd 集成

我使用 systemd 来集成 Golang 程序作为一个系统服务的方法如下:

首先新建 systemd 的 service。假设程序放到 /usr/local/bin 目录,首先新建 service 文件,名称叫做 your-service:touch /etc/systemd/system/your-service.service

第二步,编辑该文件,输入的内容如下[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 可执行文件的路径。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命令查看服务运行状态及启动错误信息。如果想要开机启动,可以使用service your-service enable 命令。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/561904.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

基于Echarts+HTML5可视化数据大屏展示—大数据智慧数据平台

🍅 作者主页:Java李杨勇 🍅 简介:Java领域优质创作者🏆、Java李杨勇公号作者✌ 简历模板、学习资料、面试题库、技术互助【关注我,都给你】 🍅 欢迎点赞 👍 收藏 ⭐留言 &#x1f…

基于Echarts+HTML5可视化数据大屏展示—新能源车联网综合大数据平台(二)

🍅 作者主页:Java李杨勇 🍅 简介:Java领域优质创作者🏆、Java李杨勇公号作者✌ 简历模板、学习资料、面试题库、技术互助【关注我,都给你】 🍅 欢迎点赞 👍 收藏 ⭐留言 &#x1f…

linux lanmp 安装教程,Linux 安装 lanmp

Lanmp介绍lanmp一键安装包是wdlinux官网2010年底开始推出的web应用环境的快速简易安装包.执行一个脚本,整个环境就安装完成就可使用,快速,方便易用,安全稳定lanmp一键安装包是用shell脚本编写,且是开源的,你也可以根据业务需求,做相应的调整,来安装自己所…

基于Echarts+HTML5可视化数据大屏展示—交通大数据分析平台

🍅 作者主页:Java李杨勇 🍅 简介:Java领域优质创作者🏆、Java李杨勇公号作者✌ 简历模板、学习资料、面试题库、技术互助【关注我,都给你】 🍅 欢迎点赞 👍 收藏 ⭐留言 &#x1f…

linux脚本安装gcc,在Linux系统下不需要编译安装GCC9,有仓库安装模板脚本

本文给出[安装GCC9]仓库安装模板脚本,在Linux系统可以编译安装GCC9,但很多编译安装的应用,有难度。复制以下代码,把它们保存到文本,然后给可执行权限,双击,终端运行,应为需要输入用户…

基于Echarts+HTML5可视化数据大屏展示—某省物流大数据平台

🍅 作者主页:Java李杨勇 🍅 简介:Java领域优质创作者🏆、Java李杨勇公号作者✌ 简历模板、学习资料、面试题库、技术互助【关注我,都给你】 🍅 欢迎点赞 👍 收藏 ⭐留言 &#x1f…

基于Echarts+HTML5可视化数据大屏展示—北斗车联网大数据平台

🍅 作者主页:Java李杨勇 🍅 简介:Java领域优质创作者🏆、Java李杨勇公号作者✌ 简历模板、学习资料、面试题库、技术互助【关注我,都给你】 🍅 欢迎点赞 👍 收藏 ⭐留言 &#x1f…

linux 空硬盘,linux – dd在整个磁盘上,但不想要空的部分

我有一个磁盘,比如/ dev / sda.这是fdisk -l:Disk /dev/sda: 64.0 GB,64023257088 bytes255 heads,63 sectors/track,7783 cylindersUnits cylinders of 16065 * 512 8225280 bytesSector size (logical/physical): 512 bytes / 512 bytesI/O size (minimum/optim…

基于Echarts+HTML5可视化数据大屏展示—Echart图例使用

🍅 作者主页:Java李杨勇 🍅 简介:Java领域优质创作者🏆、Java李杨勇公号作者✌ 简历模板、学习资料、面试题库、技术互助【关注我,都给你】 🍅 欢迎点赞 👍 收藏 ⭐留言 &#x1f…

linux如何卸载conky,Linux Deepin 15.10.2 下折腾 简单自制的 Conky Conky-manager

前言Conky是Linux下的桌面美化工具,可以把一些系统信息,以各种酷炫的形式,显示到你的桌面上。很久以前在Ubunut折腾过,最近把工作开发环境切换到了Deepin 15.10.2,打算再从零折腾一次Conky一、安装由于新版Deepin商店还…

基于Echarts+HTML5可视化数据大屏展示—设备管理大数据平台

🍅 作者主页:Java李杨勇 🍅 简介:Java领域优质创作者🏆、Java李杨勇公号作者✌ 简历模板、学习资料、面试题库、技术互助【关注我,都给你】 🍅 欢迎点赞 👍 收藏 ⭐留言 &#x1f…

linux 下i2c读写命令,S3C2440 Linux下的I2C驱动以及I2C体系下对EEPROM进行读写操作

成员。我们可以看到消息结构体里面有从设备地址,读写标志,数据长度以及存储数据buf。这些成员我们看完之后会发现它大致符合先给设备地址,然后给写信号以及数据的时序。其实但我们写代码的时候并不一定是addr非得定义在flags前面,…

基于Echarts+HTML5可视化数据大屏展示—电子商务公共服务平台大数据中心

🍅 作者主页:Java李杨勇 🍅 简介:Java领域优质创作者🏆、Java李阳勇公号作者✌ 简历模板、学习资料、面试题库、技术互助【关注我,都给你】 🍅 欢迎点赞 👍 收藏 ⭐留言 &#x1f…

natepad怎么连linux看日志,linux添加用户操作日志

1、把以下内容放至/etc/profile结尾(部分系统如CentOS 5.5可能需要放至/etc/bashrc结尾)HISTFILESIZE2000HISTSIZE2000export HISTTIMEFORMAT"%Y%m%d-%H%M%S:"export PROMPT_COMMAND{ command$(history 1 | { read x y; echo $y; } | cut -d ":" -f2-);log…

web前端大作业--黑色电影资讯博客网页设计(电影主题-HTML+CSS+JavaScript)

🍅 作者主页:Java李杨勇 🍅 简介:Java领域优质创作者🏆、【java奥斯卡】公号作者✌ 简历模板、学习资料、面试题库、技术互助【关注我,都给你】 🍅 欢迎点赞 👍 收藏 ⭐留言 &…

HTML+CSS+JS实现love520爱心表白

🍅 作者主页:Java李杨勇 🍅 简介:Java领域优质创作者🏆、【java李阳勇】公号作者✌ 简历模板、学习资料、面试题库、技术互助【关注我,都给你】 🍅 欢迎点赞 👍 收藏 ⭐留言 &…

linux为已有磁盘扩容 kvm,KVM虚拟磁盘扩容

KVM虚拟磁盘扩容1、磁盘扩容分为raw和qcow2两种扩容方式,命令相同,区别是后缀名[rootdaixuan ~]# qemu-img info /data/daixuan1.qcow2 //本身只有9Gp_w_picpath: /data/daixuan1.qcow2file format: qcow2virtual size: 10G (10737418240 bytes)disk siz…

web前端期末大作业--奥迪RS汽车主题官网设计(HTML+CSS+JavaScript)实现

临近期末, 你还在为HTML网页设计结课作业,老师的作业要求感到头大?HTML网页作业无从下手?网页要求的总数量太多?没有合适的模板?等等一系列问题。你想要解决的问题,在专栏👇🏻👇&…

linux修改密码最短生存时间,Linux基础命令---修改用户密码

passwd更改用户密码,超级用户可以修改所有用户密码,普通用户只能修改自己的密码。这个任务是通过调用LinuxPAM和LibuserAPI来完成的。本质上,它使用LinuxPAM将自己初始化为一个“passwd”服务,并利用配置的密码模块对用户的密码进…

web前端大作业--酷炫游戏动漫网页设计(HTML+CSS+JavaScript)

🍅 作者主页:Java李杨勇 🍅 简介:Java领域优质创作者🏆、【java奥斯卡】公号作者✌ 简历模板、学习资料、面试题库、技术互助【关注我,都给你】 🍅 欢迎点赞 👍 收藏 ⭐留言 &…