| Crates.io | daemon_forge |
| lib.rs | daemon_forge |
| version | 0.0.2 |
| created_at | 2025-11-28 17:50:05.52854+00 |
| updated_at | 2025-11-28 21:15:39.497952+00 |
| description | A robust, cross-platform library for daemonizing Rust applications. |
| homepage | |
| repository | https://github.com/ninunez14/daemon_forge |
| max_upload_size | |
| id | 1955809 |
| size | 37,877 |
DaemonForge is a cross-platform library for creating system daemons (background services) in Rust. It abstracts away the low-level complexities of operating system process management, providing a safe, idiomatic, and ergonomic builder API.
This crate is suitable for learning and experimentation, but not recommended for serious or production projects.
double-fork, setsid, umask, and signal handling).flock (Unix) and Global Named Mutexes (Windows) for reliable exclusion.chroot jail on Unix systems.stdout/stderr to log files, ensuring that panics and crashes are recorded instead of being lost.use daemon_forge::ForgeDaemon;
use std::fs::File;
fn main() {
let stdout = File::create("/tmp/daemon.out").unwrap();
let stderr = File::create("/tmp/daemon.err").unwrap();
let daemon = ForgeDaemon::new()
.pid_file("/tmp/test.pid")
.working_directory("/tmp")
.user("www-data") // Unix specific: drop privileges
.group("www-data")
.stdout(stdout)
.stderr(stderr)
.start();
match daemon {
Ok(_) => println!("Daemon started successfully"),
Err(e) => eprintln!("Error starting daemon: {}", e),
}
}
On Windows, it is highly recommended to set a .name() for your daemon. This creates a global mutex to ensure uniqueness.
use daemon_forge::ForgeDaemon;
use std::fs::File;
fn main() {
// Use absolute paths on Windows for safety
let stdout = File::create("C:\\Logs\\service.out").unwrap();
let stderr = File::create("C:\\Logs\\service.err").unwrap();
let daemon = ForgeDaemon::new()
.name("MyUniqueService") // Creates "Global\DaemonForge_MyUniqueService" Mutex
.pid_file("C:\\Logs\\service.pid")
.working_directory("C:\\Logs")
.stdout(stdout)
.stderr(stderr)
.start();
match daemon {
Ok(_) => println!("Service launched in background"),
Err(e) => eprintln!("Critical Failure: {}", e),
}
}
You can execute a privileged_action before the process fully daemonizes. This is useful for tasks that require higher permissions (like binding to port 80) or for checking environment prerequisites.
# use daemon_forge::ForgeDaemon;
ForgeDaemon::new()
.clear_env(true) // Clears inherited environment variables
.env("API_KEY", "secret_value") // Sets explicit variables
.privileged_action(|| {
println!("Initializing resources before forking...");
// If this returns Err, the daemon will abort startup.
Ok("Initialization Done")
});