diff options
author | Adam Chlipala <adam@chlipala.net> | 2019-08-30 17:15:48 -0400 |
---|---|---|
committer | Adam Chlipala <adam@chlipala.net> | 2019-08-30 17:15:48 -0400 |
commit | f54687e989372470c2848890e9499feb9fd70352 (patch) | |
tree | 2914a419c1ef501a0fbea0d57a338d9d68607da8 | |
parent | 0d644b4350f3e6cbb676360b0fc6a9e448137092 (diff) |
urweb daemon restart
-rw-r--r-- | doc/manual.tex | 4 | ||||
-rw-r--r-- | src/main.mlton.sml | 15 |
2 files changed, 14 insertions, 5 deletions
diff --git a/doc/manual.tex b/doc/manual.tex index 62b322ae..64fe0f24 100644 --- a/doc/manual.tex +++ b/doc/manual.tex @@ -238,6 +238,10 @@ Further \cd{urweb} invocations in the same working directory will send requests \begin{verbatim} urweb daemon stop \end{verbatim} +To restart a running (or crashed) daemon, run +\begin{verbatim} +urweb daemon restart +\end{verbatim} Communication happens via a UNIX domain socket in file \cd{.urweb\_daemon} in the working directory. \medskip diff --git a/src/main.mlton.sml b/src/main.mlton.sml index e9317d46..a6eaa7ea 100644 --- a/src/main.mlton.sml +++ b/src/main.mlton.sml @@ -107,6 +107,8 @@ fun usage flag_info = (* Encapsulate main invocation handler in a function, possibly to be called multiple times within a daemon. *) +exception DaemonExit + fun oneRun args = let val timing = ref false @@ -256,7 +258,7 @@ fun oneRun args = val () = case args of ["daemon", "stop"] => (OS.FileSys.remove socket handle OS.SysErr _ => (); - OS.Process.exit OS.Process.success) + raise DaemonExit) | _ => () val sources = parse_flags (flag_info ()) args @@ -360,7 +362,7 @@ fun startDaemon () = OS.Process.exit OS.Process.success) | _ => let - val success = (oneRun (rev args)) + val success = (oneRun (rev args) handle DaemonExit => OS.Process.exit OS.Process.success) handle ex => (print "unhandled exception:\n"; print (General.exnMessage ex ^ "\n"); OS.Process.failure) @@ -445,9 +447,12 @@ fun oneCommandLine args = else (OS.FileSys.remove socket; raise OS.SysErr ("", NONE)) - end handle OS.SysErr _ => oneRun args + end handle OS.SysErr _ => oneRun args handle DaemonExit => OS.Process.success val () = (Globals.setResetTime (); case CommandLine.arguments () of - ["daemon", "start"] => startDaemon () - | args => OS.Process.exit (oneCommandLine args)) + ["daemon", "start"] => startDaemon () + | ["daemon", "restart"] => + (ignore (oneCommandLine ["daemon", "stop"]); + startDaemon ()) + | args => OS.Process.exit (oneCommandLine args)) |