3个版本
0.1.5 | 2023年2月23日 |
---|---|
0.1.4 | 2022年4月20日 |
0.1.3 | 2021年5月21日 |
#715 in Unix API
25KB
400 代码行,不包括注释
daemonizr
一个小型crate,用于帮助在Rust中编写守护程序应用程序。
我了解到daemonize和daemonize-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