Warning: Reason support is experimental. We are looking for beta-tester and contributors.

Module Lwt_daemon

module Lwt_daemon : sig..end

Daemon helpers


val daemonize : 
  ?syslog:bool ->
  ?stdin:[ `Close | `Dev_null | `Keep ] ->
  ?stdout:[ `Close
   | `Dev_null
   | `Keep
   | `Log of Lwt_log.logger
   | `Log_default ] ->
  ?stderr:[ `Close
   | `Dev_null
   | `Keep
   | `Log of Lwt_log.logger
   | `Log_default ] ->
  ?directory:string -> ?umask:[ `Keep | `Set of int ] -> unit -> unit

Put the current running process into daemon mode. I.e. it forks and exit the parent, detach it from its controlling terminal, and redict standard intputs/outputs..

Notes:* if the process is already a daemon, it does nothing.

  • you must be sure that there is no pending threads when calling this function, otherwise they may be canceled.

If syslog is true (the default), then Lwt_log.default is set to Lwt_log.syslog ~facility:`Daemon (), otherwise it is kept unchanged.

stdin is one of:* `Dev_null which means that Unix.stdin is reopened as /dev/null, this is the default behavior

  • `Close means that Unix.stdin is simply closed
  • `Keep means that Unix.stdin is left unchanged

stdout and stderr control how the two associated file descriptors are redirected:* `Dev_null means that the output is redirected to /dev/null

  • `Close means that the file descriptor is closed
  • `Keep means that it is left unchanged
  • `Log logger means that the output is redirected to this logger
  • `Log_default means that the output is redirected to the default logger

Both stdout and stderr defaults to `Log_default.

Warning: do not redirect an output to a logger logging into this outpout, for example this code will create an infinite loop:

let logger = Lwt_log.channel ~close_mode:`Keep ~channel:Lwt_io.stderr () in
        Lwt_daemon.daemonize ~syslog:false ~stderr:(`Log logger) ();
        prerr_endline "foo"


The current working directory is set to directory, which defaults to "/".

umask may be one of:* `Keep which means that the umask is left unchanged

  • `Set n which means that the umash is set to n

It defaults to `Set 0o022.