1 (* Copyright (C
) 1999-2006 Henry Cejtin
, Matthew Fluet
, Suresh
2 * Jagannathan
, and Stephen Weeks
.
4 * MLton is released under a BSD
-style license
.
5 * See the file MLton
-LICENSE for details
.
8 structure InitScript
: INIT_SCRIPT
=
11 val messageStr
= Trace
.Immediate
.messageStr
14 (* Losely based on
/etc
/sysconfig
/init
*)
16 open Console
open Foreground CharRendition
17 fun make (settings
, msg
) =
19 val color
= concat
[moveToColumn
60, "[ ", set settings
, msg
,
20 set
[Default
], " ]\n"]
21 val normal
= concat
[" [ ", msg
, " ]\n"]
23 print (case Process
.getEnv
"TERM" of
25 | SOME
"xterm" => color
29 val succeed
= make ([Bold
, Foreground BrightGreen
], "OK")
30 val fail
= make ([Bold
, Foreground BrightRed
], "FAILED")
31 val warn
= make ([Bold
, Foreground Yellow
], "PASSED")
34 fun wrap (th
: unit
-> unit
): unit
=
35 ((th () handle e
=> (fail (); raise e
))
38 fun startStop
{name
, action
, log
, thunk
, usage
} =
40 val me
= Pid
.current ()
42 List.peek (Process
.ps (), fn {name
= n
, pid
, ...} =>
43 n
= name
andalso not (Pid
.equals (me
, pid
)))
44 val isRunning
= isSome
o getProc
47 then print (concat
[name
, " is already running\n"])
52 val _
= print (concat
["Starting ", name
, ":"])
53 val _
= Out
.close Out
.error
54 val _
= Out
.set (Out
.error
, Out
.openAppend log
)
59 val _
= In
.close In
.standard
60 val _
= Out
.close Out
.standard
61 val _
= Posix
.ProcEnv
.setpgid
{pid
= NONE
, pgid
= NONE
}
64 (Posix
.Signal
.term
, Signal
.Handler
.handler (fn _
=>
67 (messageStr
"received Signal.term -- exiting"
68 ; Process
.succeed ()))))
78 else " is not running\n"])
81 NONE
=> print (concat
[name
, " is not running\n"])
84 (print (concat
["Shutting down ", name
, ":"])
85 ; Process
.signalGroup (pgrp
, Posix
.Signal
.term
)))
88 |
"status" => status ()
90 | _
=> usage
"must start|status|stop"