
Обычно в языках программирования отличных от 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()
}