geminid

A Sandboxed Gemini server
git clone git@git.mpah.dev/geminid.git
Log | Files | Refs | README

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);