godaemon

Daemonize Go applications deviously.

  • Owner: VividCortex/godaemon
  • Platform:
  • License:: MIT License
  • Category::
  • Topic:
  • Like:
    0
      Compare:

Github stars Tracking Chart

godaemon

Daemonize Go applications with exec() instead of fork(). Read our blog post on the subject.

You can't daemonize the usual way in Go. Daemonizing is a Unix concept that requires
some specific things you can't do
easily in Go. But you can still accomplish the same goals
if you don't mind that your program will start copies of itself
several times, as opposed to using fork() the way many programmers are accustomed to doing.

It is somewhat controversial whether it's even a good idea to make programs daemonize themselves,
or how to do it correctly (and whether it's even possible to do correctly in Go).
Read here,
here,
and here
for more on this topic. However, at VividCortex we do need to run one of our processes as a
daemon with the usual attributes of a daemon, and we chose the approach implemented in this package.

Because of the factors mentioned in the first link just given, you should take great care when
using this package's approach. It works for us, because we don't do anything like starting up
goroutines in our init() functions, or other things that are perfectly legal in Go in general.

Getting Started

View the package documentation
for details about how it works. Briefly, to make your program into a daemon,
do the following as soon as possible in your main() function:

import (
	"github.com/VividCortex/godaemon"
)

func main() {
	godaemon.MakeDaemon(&godaemon.DaemonAttr{})
}

Use the CaptureOutput attribute if you need to capture your program's
standard output and standard error streams. In that case, the function returns
two valid readers (io.Reader) that you can read from the program itself.
That's particularly useful for functions that write error or diagnosis messages
right to the error output, which are normally lost in a daemon.

Use the Files attribute if you need to inherit open files into the daemon.
This is primarily intended for avoiding race conditions when holding locks on
those files (flocks). Releasing and re-acquiring locks between successive fork
calls opens up the chance for another program to steal the lock. However, by
declaring your file descriptors in the Files attribute, MakeDaemon() will
guarantee that locks are not released throughout the whole process. Your daemon
will inherit the file still holding the same locks, with no other process having
intervened in between. See the
package documentation for
more details and sample code. (Note that you shouldn't use this feature to
inherit TTY descriptors; otherwise what you get is technically not a daemon.)

Contribute

Contributions are welcome. Please open pull requests or issue reports!

License

This repository is Copyright (c) 2013 VividCortex, Inc. All rights reserved.
It is licensed under the MIT license. Please see the LICENSE file for applicable
license terms.

Authors

The primary author is Gustavo Kristic, with some
documentation and other minor contributions by others at VividCortex.

History

An earlier version of this concept with a slightly different interface was
developed internally at VividCortex.

Cats

A Go Daemon is a good thing, and so we present an angelic cat picture:

Angelic Cat

Main metrics

Overview
Name With OwnerVividCortex/godaemon
Primary LanguageGo
Program languageGo (Language Count: 1)
Platform
License:MIT License
所有者活动
Created At2013-08-01 17:16:30
Pushed At2021-06-29 04:55:28
Last Commit At2021-04-26 22:25:47
Release Count1
Last Release Namev1.0.0 (Posted on )
First Release Namev1.0.0 (Posted on )
用户参与
Stargazers Count493
Watchers Count29
Fork Count55
Commits Count45
Has Issues Enabled
Issues Count20
Issue Open Count8
Pull Requests Count12
Pull Requests Open Count1
Pull Requests Close Count5
项目设置
Has Wiki Enabled
Is Archived
Is Fork
Is Locked
Is Mirror
Is Private