reactive_graph/server/daemon/
mod.rs1pub mod args;
2
3use crate::server::daemon::args::DaemonArguments;
4use daemonize_me::Daemon;
5use daemonize_me::Group;
6use daemonize_me::User;
7use std::any::Any;
8use std::fs::File;
9use std::process::exit;
10
11pub fn daemonize(args: &DaemonArguments) {
13 let daemon = Daemon::new()
14 .work_dir(args.daemon_working_directory.clone().unwrap_or(String::from(".")))
15 .setup_post_fork_parent_hook(post_fork_parent)
16 .setup_post_fork_child_hook(post_fork_child)
17 .setup_post_init_hook(after_init, None);
18 let daemon = match args.daemon_name {
19 Some(ref daemon_name) => daemon.name(daemon_name.as_ref()),
20 None => daemon,
21 };
22 let daemon = match args.daemon_pid {
23 Some(ref daemon_pid) => daemon.pid_file(daemon_pid, Some(false)),
24 None => daemon,
25 };
26 let daemon = match args.daemon_stdout {
27 Some(ref daemon_stdout) => match File::create(daemon_stdout) {
28 Ok(stdout) => daemon.stdout(stdout),
29 Err(_) => daemon,
30 },
31 None => daemon,
32 };
33 let daemon = match args.daemon_stderr {
34 Some(ref daemon_stderr) => match File::create(daemon_stderr) {
35 Ok(stderr) => daemon.stderr(stderr),
36 Err(_) => daemon,
37 },
38 None => daemon,
39 };
40 let daemon = if let (Some(ref daemon_user), Some(ref daemon_group)) = (args.daemon_user.clone(), args.daemon_group.clone()) {
41 if let (Ok(daemon_user), Ok(daemon_group)) = (User::try_from(daemon_user), Group::try_from(daemon_group)) {
42 daemon.user(daemon_user).group(daemon_group)
43 } else {
44 daemon
45 }
46 } else {
47 daemon
48 };
49
50 let daemon = daemon.start();
51 match daemon {
52 Ok(_) => println!("Process has been daemonized with success"),
53 Err(e) => {
54 eprintln!("Failed to run as daemon: {e}");
55 exit(-1);
56 }
57 }
58}
59
60pub fn post_fork_parent(_parent_pid: i32, _child_pid: i32) -> ! {
61 exit(0);
62}
63
64pub fn post_fork_child(_parent_pid: i32, _child_pid: i32) {
65 }
67
68pub fn after_init(_: Option<&dyn Any>) {}