[][src]Crate spirit_daemonize

A spirit extension for daemonization.

The configuration in here extends the spirit configuration framework to automatically go into background based on user's configuration and command line options.


extern crate spirit;
extern crate spirit_daemonize;
extern crate serde_derive;
extern crate structopt;

use spirit::prelude::*;
use spirit_daemonize::{Daemon, Opts as DaemonOpts};

// From config files
#[derive(Default, Deserialize)]
struct Cfg {
    daemon: Daemon,

impl Cfg {
   fn daemon(&self, opts: &Opts) -> Daemon {

// From command line
#[derive(Debug, StructOpt)]
struct Opts {
    daemon: DaemonOpts,

fn main() {
     Spirit::<Opts, Cfg>::new()
        .run(|_spirit| {
            // Possibly daemonized program goes here

Added options

The program above gets the -d command line option, which enables daemonization. Furthermore, the configuration now understands a new daemon section, with these options:

  • user: The user to become. Either a numeric ID or name. If not present, it doesn't change the user.
  • group: Similar as user, but with group.
  • pid-file: A pid file to write on startup. If not present, nothing is stored.
  • workdir: A working directory it'll switch into. If not set, defaults to /.
  • daemonize: Should this go into background or not? If combined with the Opts, it can be overridden on command line.

Multithreaded applications

As daemonization is done by using fork, you should start any threads after you initialize the spirit. Otherwise you'll lose the threads (and further bad things will happen).

The daemonization happens inside the config_validator callback. If other config validators need to start any threads, they should be plugged in after the daemonization callback. However, the safer option is to start them inside the run method.



A configuration fragment for configuration of daemonization.


Command line options fragment.


A stripped-down version of Daemon without the user-switching options.



Configuration of either user or a group.