diff --git a/Cargo.toml b/Cargo.toml index a35dde3..d8c78cf 100644 --- a/Cargo.toml +++ b/Cargo.toml @@ -20,4 +20,5 @@ log = "0.4.22" futures = "0.3.30" chrono = { version = "0.4.38", features = ["alloc"]} futures-util = "0.3.30" -h2 = "0.4.6" \ No newline at end of file +h2 = "0.4.6" +daemonize = "0.5.0" diff --git a/src/main.rs b/src/main.rs index a991a8d..07579a7 100644 --- a/src/main.rs +++ b/src/main.rs @@ -23,6 +23,7 @@ use std::net::SocketAddr; use std::str::FromStr; use std::sync::{Arc, Mutex}; use std::time::SystemTime; +use daemonize::Daemonize; use tokio::net::TcpListener; #[derive(Serialize, Deserialize)] @@ -211,7 +212,19 @@ fn find_in_vars(pattern: &str) -> String { #[tokio::main] async fn main() { - let _ = dotenv(); + let stdout = File::create("/tmp/daemon.out").unwrap(); + let stderr = File::create("/tmp/daemon.err").unwrap(); + + let daemonize = Daemonize::new() + .pid_file("/tmp/test.pid") // Every method except `new` and `start` + .chown_pid_file(true) // is optional, see `Daemonize` documentation + .working_directory("/tmp") // for default behaviour. + .stdout(stdout) // Redirect stdout to `/tmp/daemon.out`. + .stderr(stderr); // Redirect stderr to `/tmp/daemon.err`. + + match daemonize.start() { + Ok(_) => { + let _ = dotenv(); let db_adrr = find_in_vars("DATABASE_ADRR"); let db_pool = Arc::new(Mutex::new(SqlitePool::connect(&db_adrr).await.unwrap())); let bind_adrr: SocketAddr = SocketAddr::from_str(find_in_vars("BIND_ADRR").as_str()).expect("Could not parse bind address"); @@ -231,5 +244,8 @@ async fn main() { println!("Failed to serve connection: {:?}", err); } }); + }}, + Err(e) => eprintln!("Error, {}", e), } + } \ No newline at end of file