GoProg

 
Топ хэштегов


Архив

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

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

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

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

#daemon #fork #Go #golang #программирование



Новый комментарий: