summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--doc/manual.tex4
-rw-r--r--src/main.mlton.sml15
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))