From f54687e989372470c2848890e9499feb9fd70352 Mon Sep 17 00:00:00 2001 From: Adam Chlipala Date: Fri, 30 Aug 2019 17:15:48 -0400 Subject: urweb daemon restart --- doc/manual.tex | 4 ++++ 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)) -- cgit v1.2.3