daemonize.ml (895B)
1 open Log 2 3 let log_stop_signals signals pid = 4 List.map (fun s -> 5 Sys.set_signal s (Signal_handle (fun _ -> 6 log_msg ("DAEMON STOP pid: " ^ string_of_int pid); 7 exit 0; 8 ))) signals 9 10 (* Set logfile to an empty string to enforce a no-log policy *) 11 let daemonize logfile = 12 if Lwt_unix.fork () <> 0 then 13 exit 0; 14 15 ignore (Unix.umask (022)); 16 ignore (Unix.setsid ()); 17 18 Unix.close Unix.stdout; 19 Unix.close Unix.stderr; 20 21 if logfile <> "" then 22 (* Redirect stdout and stderr channels to logfile *) 23 let oc = open_out_gen [Open_append; Open_creat; Open_wronly] 0o600 logfile in 24 Unix.dup2 (Unix.descr_of_out_channel oc) Unix.stdout; 25 Unix.dup2 (Unix.descr_of_out_channel oc) Unix.stderr; 26 27 let pid = (Unix.getpid ()) in 28 log_msg ("DAEMON START pid: " ^ string_of_int pid); 29 flush stdout; 30 31 ignore (log_stop_signals [Sys.sigterm ; Sys.sigint] pid);