#daemon #spirit #unix #service

spirit-daemonize

Spirit 助手和配置片段以实现守护进程化

12 个版本

0.5.1 2021年10月26日
0.5.0 2021年1月15日
0.4.0 2020年10月20日
0.3.1 2020年7月20日
0.1.1 2018年10月18日

#920 in Unix API

50 每月下载量
spirit 中使用

Apache-2.0 OR MIT

315KB
3.5K SLoC

Spirit-daemonize

Travis Build Status

将守护进程化集成到 spirit 配置框架中的助手和配置片段。

请参阅文档示例

许可证

许可协议为以下之一

您可选其一。

贡献

除非您明确表示,否则根据 Apache-2.0 许可协议定义的,您有意提交的任何贡献,均应双重许可,如上所述,不附加任何额外条款或条件。


lib.rs:

Spirit 的守护进程化扩展。

这里的配置扩展了 spirit 配置框架,根据用户的配置和命令行选项自动进入后台。

示例

use serde::Deserialize;
use spirit::Spirit;
use spirit::prelude::*;
use spirit_daemonize::{Daemon, Opts as DaemonOpts};
use structopt::StructOpt;

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

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

fn main() {
     Spirit::<Opts, Cfg>::new()
        .with(unsafe {
            spirit_daemonize::extension(|c: &Cfg, o: &Opts| {
                (c.daemon.clone(), o.daemon.clone())
            })
        })
        .run(|_spirit| {
            // Possibly daemonized program goes here
            Ok(())
        });
}

添加选项

上面的程序获取了 -d 命令行选项,启用守护进程化。此外,配置现在可以理解一个新的 daemon 部分,包含以下选项

  • user: 要成为的用户。可以是数字 ID 或名称。如果不存在,则不会更改用户。
  • group: 与用户类似,但针对组。
  • pid-file: 启动时写入的 pid 文件。如果不存在,则不存储任何内容。
  • workdir: 将切换到的当前工作目录。如果没有设置,则默认为 /
  • daemonize:是否应该进入后台?如果与Opts结合使用,则可以在命令行中覆盖。

多线程应用程序

由于是通过fork来实现守护进程化,你应该在初始化spirit之后开始任何线程。否则,你会丢失线程(并可能发生其他更糟糕的事情)。

守护进程化发生在validator actions的应用程序中,这是由config_validator回调完成的。如果其他配置验证器需要启动任何线程,它们应该在守护进程化回调之后连接。然而,更安全的选项是在run方法中启动它们。

依赖项

~6.5MB
~128K SLoC