Go: создание демонов

Обычно в языках программирования отличных от Go для создания демонов используется системный вызов fork. К сожалению, в Go его нельзя использовать потому что, порожденный процесс не наследует потоки и go-ротины. Для обхода этой проблемы можно использовать следующий трюк: запуск копии процесса с предустановленной переменной окружения, наличие которой сигнализирует процессу, что он дочерний.

Этот подход реализован в библиотеке go-daemon, размещенной на github-e.

Для ее использования первым делом установим ее в текущий проект:

go get github.com/sevlyar/go-daemon

После чего используем ее в программе:

package main

import (
    "github.com/sevlyar/go-daemon"
    "os"
)

func main() {

    // demonize process
    cntxt := &daemon.Context{
        PidFileName: "daemon.pid",
        PidFilePerm: 0644,
        LogFileName: "daemon.log",
        LogFilePerm: 0640,
        WorkDir:     "/var/daemon",
        Umask:       027,
        Args:        os.Args,
    }

    child, _ := cntxt.Reborn()

    if( child != nil ) {
        defer cntxt.Release()
        ParentProc()
        return
    }

    ChildProc()
}

Тэги: go golang программирование


 


 
архив

подписка