当前位置: 首页 > 软件库 > 程序开发 > 常用工具包 >

GO daemon

Go的服务进程包
授权协议 MIT
开发语言 Google Go
所属分类 程序开发、 常用工具包
软件类型 开源软件
地区 不详
投 递 者 轩辕乐邦
操作系统 跨平台
开源组织
适用人群 未知
 软件概览

daemon 是没有任何依赖的 Go(golang)服务守护进程包。

示例

简单示例 (just install self as daemon):

package mainimport (
    "fmt"
    "log"

    "github.com/takama/daemon")func main() {
    service, err := daemon.New("name", "description")
    if err != nil {
        log.Fatal("Error: ", err)
    }
    status, err := service.Install()
    if err != nil {
        log.Fatal(status, "\nError: ", err)
    }
    fmt.Println(status)}

实际示例:

// Example of the daemon with echo servicepackage mainimport (
    "fmt"
    "log"
    "net"
    "os"
    "os/signal"
    "syscall"

    "github.com/takama/daemon")const (

    // name of the service, match with executable file name
    name        = "myservice"
    description = "My Echo Service"

    // port which daemon should be listen
    port = ":9977")// Service has embedded daemontype Service struct {
    daemon.Daemon}// Manage by daemon commands or run the daemonfunc (service *Service) Manage() (string, error) {

    usage := "Usage: myservice install | remove | start | stop | status"

    // if received any kind of command, do it
    if len(os.Args) > 1 {
        command := os.Args[1]
        switch command {
        case "install":
            return service.Install()
        case "remove":
            return service.Remove()
        case "start":
            return service.Start()
        case "stop":
            return service.Stop()
        case "status":
            return service.Status()
        default:
            return usage, nil
        }
    }

    // Do something, call your goroutines, etc

    // Set up channel on which to send signal notifications.
    // We must use a buffered channel or risk missing the signal
    // if we're not ready to receive when the signal is sent.
    interrupt := make(chan os.Signal, 1)
    signal.Notify(interrupt, os.Interrupt, os.Kill, syscall.SIGTERM)

    // Set up listener for defined host and port
    listener, err := net.Listen("tcp", port)
    if err != nil {
        return "Possibly was a problem with the port binding", err
    }

    // set up channel on which to send accepted connections
    listen := make(chan net.Conn, 100)
    go acceptConnection(listener, listen)

    // loop work cycle with accept connections or interrupt
    // by system signal
    for {
        select {
        case conn := <-listen:
            go handleClient(conn)
        case killSignal := <-interrupt:
            log.Println("Got signal:", killSignal)
            log.Println("Stoping listening on ", listener.Addr())
            listener.Close()
            if killSignal == os.Interrupt {
                return "Daemon was interruped by system signal", nil
            }
            return "Daemon was killed", nil
        }
    }

    // never happen, but need to complete code
    return usage, nil}// Accept a client connection and collect it in a channelfunc acceptConnection(listener net.Listener, listen chan<- net.Conn) {
    for {
        conn, err := listener.Accept()
        if err != nil {
            continue
        }
        listen <- conn
    }}func handleClient(client net.Conn) {
    for {
        buf := make([]byte, 4096)
        numbytes, err := client.Read(buf)
        if numbytes == 0 || err != nil {
            return
        }
        client.Write(buf)
    }}func main() {
    srv, err := daemon.New(name, description)
    if err != nil {
        fmt.Println("Error: ", err)
        os.Exit(1)
    }
    service := &Service{srv}
    status, err := service.Manage()
    if err != nil {
        fmt.Println(status, "\nError: ", err)
        os.Exit(1)
    }
    fmt.Println(status)}

 

  • 目录 1.前言 2.区分两个概念 3.首先排除的方案 4.相关的标准库的探索 5.尝试让go程序后台运行 5.1 go调用普通外部程序 5.2 go程序调用自身转为后台运行 解决怎么区分父进程子进程的问题 5.3 如何在子进程中再次启动子进程 6.守护进程的实现 xdaemon库的使用示例 1.前言 因为最近用go语言开发了一个websocket服务,启动后需要后台运行,还希望异常退出时可以自动重

  • package main import (     "fmt"     "log"     "net/http"     "os"     "os/signal"     "syscall" ) func main() {     File, err := os.Create("log")     if err != nil {         fmt.Println("创建日志文件错误", er

  • 1、使用nohup ./commond & 这种方法最简单. 2、这种方法可以使用信号. <pre name="code" class="html">package main import ( "fmt" "os" "os/signal" "syscall" "time" ) func main() { if os.Getppid() != 1 { args := append

  • 1. mongo-go-driver包的导入或安装 对于使用go modules来进行包管理的开发人员,可以通过从go.mongodb.org/mongo-driver导入包并让构建步骤来自动安装依赖包,或者通过显式运行以下命令来安装: go get go.mongodb.org/mongo-driver/mongo 如果你使用的是不支持modules的go版本,你可以使用dep来安装: dep

  • 引用:https://bitbucket.org/kardianos/service service will install / un-install, start / stop, and run a program as a service (daemon). Currently supports Windows XP+, Linux/Upstart, and OSX/Launchd. pac

  • 昨天搞了个文件共享的小程序,遇见了意见蛋疼的事,就是启动之后终端不能关闭,不然程序也会随着关闭. 我的解决方法: nohup ./httpserver & nohup这个命令可以把程序放后台运行,顺便通过1>和2>把标准输出和标准错误重定向到文件,这样程序崩溃时才会有记录可查,这两者和程序的日志最好是分开,混在一起没办法判断轻重缓急: nohup ./server 1> server.out 2

  • 目录 第一步:通过uname -r命令查看你当前的内核版本 第二步:使用 root 权限登录 Centos。确保 yum 包更新到最新。 第三步:卸载旧版本(如果安装过旧版本的话) 第四步:安装需要的软件包, yum-util 提供yum-config-manager功能,另外两个是devicemapper驱动依赖的 第五步:设置yum源 第六步:可以查看所有仓库中所有docker版本,并选择特定

  • daemon的概念 守护进程(daemon)就是一直在后台运行的进程,它没有控制终端,无法和前台的用户交互。当我们打开一个终端时会创建一个session会话(shell),从用户登录开始到用户退出为止,这段时间内在该终端执行的进程都属于这一个会话。一个会话一般包含一个前台进程组、一个后台进程组和一个会话首进程(shell程序本身)。 例如用以下命令启动5个进程: $ proc1 | proc2 &

  • 所用到的库 github.com/kardianos/service 需要golang.org/x/sys做依赖库.请注意翻墙 或者从https://github.com/golang/sys先下载下来 复制代码 代码片段 package main import ( "github.com/kardianos/service" "os" "sync" ) type program stru

  • 欢迎加入go语言学习交流群:636728449 2019年3月,发布了适用于MongoDB的正式的可用于生产环境的GO驱动程序,该驱动程序自发布以来一直在持续更新。在本教程中,我们将学习使用Go驱动程序执行简单的MongoDB CRUD操作。 环境准备 在开始本教程之前,需要做两件事。 Go应该安装在您的机器上。本教程使用Go 1.15版。您可以从此链接下载Go软件包。 在您的电脑上安装最新版本的

  • 1. go mod 1.1 创建项目 创建一个目录 root@liubei:/data/goproject/src# mkdir go-test root@liubei:/data/goproject/src# cd go-test/ 添加main.go package main import "github.com/gin-gonic/gin" func main() { r := gi

  • 这是启动容器报的错,docker logs没有,容器创建了,但是启动不了容器 Error response from daemon: OCI runtime create failed: container_linux.go:349: starting container process caused “process_linux.go:449: container init caused “ro

  • 1、获取依赖:go get "go.mongodb.org/mongo-driver" 2、连接数据库 前提:确保mongo进程已启动:ps -ef|grep mongo import ( "context" "go.mongodb.org/mongo-driver/mongo" "go.mongodb.org/mongo-driver/mongo/options" "log" ) va

  • go 程序往往以exec之类的再次执行自己来实现daemon。 有类似文章: 如何让go程序以后台进程或daemon方式运行 - 知乎

  • 连接 package mongodb import ( "context" "go.mongodb.org/mongo-driver/mongo" "go.mongodb.org/mongo-driver/mongo/options" "log" ) var mgoCli *mongo.Client func initDb() { var err error clientOpti

 相关资料
  • 问题内容: 好的,我正在开发一个程序,该程序将部署到许多机器(Windows,Linux,AIX,z / Linux,openVMS等)上。我希望该应用程序包含SOAP Web服务,但是我不想捆绑tomcat或为这些服务运行单独的服务(我希望它们与应用程序的其余部分在同一过程中)。 基本上,我正在寻找可以定义类的东西(例如)。我也可以编写WSDL或任何其他类型的服务描述。我想要这样的东西: 显然,

  • 我有一个简单的Python脚本作为守护程序工作。我正在尝试创建systemd脚本,以便能够在启动期间启动此脚本。 当前systemd脚本: node.py: < code>run包含< code>while True循环。 我尝试使用< code > system CTL start zebra-node . service 运行此服务。不幸的是,服务从来没有完成状态序列-我必须按下Ctrl C。

  • 服务器关闭进程可以概括为: 1. 启动关闭进程 2. 服务器根据需要创建关闭线程 3. 服务器停止接收新连接 4. 服务器终止当前的活动 5. 存储引擎被停掉或关闭 6. 服务器退出 下面是更详细的描述: 1. 启动关闭进程。 可以用多种方法启动服务器的关闭。例如,拥有SHUTDOWN权限的用户可以执行mysqladmin shutdown命令。mysqladmin可以用于所有支持MySQL的平台

  • 以下是用Dockerfile设置sshd服务容器,您可以使用连接并检查其他容器的卷,或者可以快速访问测试容器。 # sshd # # VERSION 0.0.1 FROM ubuntu:12.04 MAINTAINER Thatcher R. Peskens "thatcher@dotcloud.com" # make sure the package re

  • 我的设备有一个前台服务,需要全天候工作。有时当gms更新发生时,它会杀死所有的gms服务 我的服务也使用gms(firbase AuthService),所以它也会被杀死 如何停止更新我的服务时,其他gms服务得到更新。我需要防止我的服务不能再次启动,而gms更新。 这里有一些日志:-- ActivityManager:调度重启崩溃的服务com.google.android.gms/.chimer

  • 接下来我们将通过 “Git” 协议建立一个基于守护进程的仓库。 对于快速且无需授权的 Git 数据访问,这是一个理想之选。 请注意,因为其不包含授权服务,任何通过该协议管理的内容将在其网络上公开。 如果运行在防火墙之外的服务器上,它应该只对那些公开的只读项目服务。 如果运行在防火墙之内的服务器上,它可用于支撑大量参与人员或自动系统(用于持续集成或编译的主机)只读访问的项目,这样可以省去逐一配置 S

  • 本文向大家介绍详解node中创建服务进程,包括了详解node中创建服务进程的使用技巧和注意事项,需要的朋友参考一下 背景 在node工程部署中,常常涉及到三方:本地客户端、跳板机和服务器(集群)。在通过git触发gitlab hook脚本后,需要在跳板机中执行相应的ssh命令执行shell文件启动node服务器,这需要使用一个常用的命令setsid,这样当ssh命令执行完毕shell退出后,nod

  • 服务烧瓶应用程序“服务器”(懒惰加载) 环境:生产警告:这是一个开发服务器。不要在生产部署中使用它。改用生产WSGI服务器。 调试模式:打开 在http://0.0.0.0:9002/上运行(按Ctrl+C退出) 使用stat重新启动 调试器处于活动状态! 调试器PIN:314-390-242线程线程中的异常-1:Traceback(最近的调用为last):文件“/home/user/downlo