#daemon #unix #daemonize #system

daemonizr

一个小型crate,用于帮助在Rust中编写守护程序应用程序

3个版本

0.1.5 2023年2月23日
0.1.4 2022年4月20日
0.1.3 2021年5月21日

#715 in Unix API

MIT许可

25KB
400 代码行,不包括注释

Rust Crates.io

daemonizr

一个小型crate,用于帮助在Rust中编写守护程序应用程序。

我了解到daemonizedaemonize-mecrate,但需要一些扩展功能,如锁定PID文件和搜索正在运行的守护程序。

完整示例

use daemonizr::{Daemonizr, DaemonizrError, Group, Stderr, Stdout, User};
use std::{path::PathBuf, process::exit, thread::sleep, time::Duration};

fn main() {
    match Daemonizr::new()
        .work_dir(PathBuf::from("/Users/alex/git/private/daemonizr"))
        .expect("invalid path")
        .as_user(User::by_name("alex").expect("invalid user"))
        .as_group(Group::by_name("staff").expect("invalid group"))
        .pidfile(PathBuf::from("dmnzr.pid"))
        .stdout(Stdout::Redirect(PathBuf::from("dmnzr.out")))
        .stderr(Stderr::Redirect(PathBuf::from("dmnzr.err")))
        .umask(0o027)
        .expect("invalid umask")
        .spawn()
    {
        Err(DaemonizrError::AlreadyRunning) => {
            /* search for the daemon's PID  */
            match Daemonizr::new()
                .work_dir(PathBuf::from("/Users/alex/git/private/daemonizr"))
                .unwrap()
                .pidfile(PathBuf::from("dmnzr.pid"))
                .search()
            {
                Err(x) => eprintln!("error: {}", x),
                Ok(pid) => {
                    eprintln!("another daemon with pid {} is already running", pid);
                    exit(1);
                }
            };
        }
        Err(e) => eprintln!("DaemonizrError: {}", e),
        Ok(()) => { /* We are in daemon process now */ }
    };

    /* actual daemon work goes here */
    println!("write something to stdout");
    eprintln!("write something to stderr");
    sleep(Duration::from_secs(60));
    println!("Daemon exits.")
}

提示

⚠️ 此crate只能在POSIX兼容的系统上运行,其中提供了"nix"和"libc"crate。

依赖关系

~1.5MB
~35K SLoC