GO daemon

MIT
Google Go
跨平台
2014-09-22
叶秀兰

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)}


加载中

评论(0)

暂无评论

暂无资讯

暂无问答

Java Daemon thread

What is Daemon thread in Java and Difference to Non daemon thread - Tutorial Example Daemon thread in Java are those thread which runs in background and mostly created by JVM fo...

2014/04/17 20:46
38
0
A Simple Introduction to Linux Daemon (with exa...

Daemon In Unix and other multitasking computer operating systems, a daemon is a computer program that runs as a background process, rather than being under the direct control of...

2012/06/13 15:42
209
0
如何写一个daemon程序

在实际的服务器后台程序开发时,有时需要将某个服务 daemon 化来完成一些定时任务,比如往 KV 系统中刷新数据。 有两个问题需要提前弄清楚: * daemon 程序中的 pid file 有什么作用? * 为什么...

2015/09/20 16:38
172
0
关于Daemon

1、linux中Daemon的主要分类: standalone:此类可以自行单独启动服务。 优点:一直都在内存中,所以对请求的响应会相对较快。常见的有httpd,vsftpd super daemon:由一个特殊的daemon来同意...

2010/08/22 08:57
133
0
使用apache daemon让java程序在unix系统上以服务方式运行

通过使用apache_commons_daemon,可以让Java程序在unix系统上以服务器的方式运行。 当然,通过wrapper也是可以达到这样的目的,wrapper还可以指定java应用中用到的第三方jar目录,由wrapper...

2016/09/03 00:52
93
0
android开发之线程(守护线程daemon和User Thread)

Java将线程分为User线程和Daemon线程两种。其中Daemon thread即守护线程。 1.所谓守护线程就是运行在程序后台的线程,程序的主线程Main(比方java程序一开始启动时创建的那个线程)不会是守护...

2015/08/07 10:31
1K
0
daemon函数结合脚本实现start, stop, restart

利用daemon函数实现后台进程,利用脚本来实现对程序的使用

2014/08/29 11:27
793
0
守护进程daemon的创建和使用

《Unix高级环境编程》中介绍了怎么写一个daemon的基本步骤,但是没有讲到在怎么在系统中使用(即像apache那样开机启动,关机停止),在这里写了一个简单的例子供大家参考。

2013/12/11 22:23
2.7K
1
start-stop-daemon 在Red Hat没有发现

最近使用 unbuntu 用apt-get装nginx .装完后还有个 /etc/init.d/nginx 的服务项,可以启动关闭进程. 在readhat 用ngixn 编译安装后没有/etc/init.d/nginx 把unbuntu 的/etc/init.d/nginx cop...

2011/03/31 11:14
606
0
Daemon线程--《Java并发编程的艺术》学习笔记

daemon线程即守护线程 当一个JVM中不存在非Daemon线程时,JVM将会退出 也就是说当非Daemon线程都执行完毕时,java程序也就结束了。 可以通过调用Thread.setDaemon(true)将线程设置为Daemon线...

2018/10/16 22:44
55
0

没有更多内容

加载失败,请刷新页面

返回顶部
顶部