]> gitweb.factorcode.org Git - factor.git/blob - basis/io/launcher/launcher-docs.factor
45bbec20e345cd0cd9d70a4da7c26edfd56e1752
[factor.git] / basis / io / launcher / launcher-docs.factor
1 ! Copyright (C) 2007, 2008 Slava Pestov.
2 ! See http://factorcode.org/license.txt for BSD license.
3 USING: help.markup help.syntax quotations kernel io io.files
4 math calendar ;
5 IN: io.launcher
6
7 ARTICLE: "io.launcher.command" "Specifying a command"
8 "The " { $snippet "command" } " slot of a " { $link process } " can contain either a string or a sequence of strings. In the first case, the string is processed in an operating system-specific manner. In the second case, the first element is a program name and the remaining elements are passed to the program as command-line arguments." ;
9
10 ARTICLE: "io.launcher.detached" "Running processes in the background"
11 "By default, " { $link run-process } " waits for the process to complete. To run a process without waiting for it to finish, set the " { $snippet "detached" } " slot of a " { $link process } ", or use the following word:"
12 { $subsection run-detached } ;
13
14 ARTICLE: "io.launcher.environment" "Setting environment variables"
15 "The " { $snippet "environment" } " slot of a " { $link process } " contains an association mapping environment variable names to values. The interpretation of environment variables is operating system-specific."
16 $nl
17 "The " { $snippet "environment-mode" } " slot controls how the environment of the current Factor instance is composed with the value of the " { $snippet "environment" } " slot:"
18 { $subsection +prepend-environment+ }
19 { $subsection +replace-environment+ }
20 { $subsection +append-environment+ }
21 "The default value is " { $link +append-environment+ } "." ;
22
23 ARTICLE: "io.launcher.redirection" "Input/output redirection"
24 "On all operating systems except for Windows CE, the default input/output/error streams can be redirected."
25 $nl
26 "To specify redirection, set the " { $snippet "stdin" } ", " { $snippet "stdout" } " and " { $snippet "stderr" } " slots of a " { $link process } " to one of the following values:"
27 { $list
28     { { $link f } " - default value; the stream is either inherited from the current process, or is a " { $link <process-stream> } " pipe" }
29     { { $link +closed+ } " - the stream is closed; reads will return end of file and writes will fails" }
30     { { $link +stdout+ } " - a special value for the " { $snippet "stderr" } " slot only, indicating that the standard output and standard error streams should be merged" }
31     { "a path name - the stream is sent to the given file, which must exist for input and is created automatically on output" }
32     { "an " { $link appender } " wrapping a path name - output is sent to the end given file, as with " { $link <file-appender> } }
33     { "a file stream or a socket - the stream is connected to the given Factor stream, which cannot be used again from within Factor and must be closed after the process has been started" }
34 } ;
35
36 ARTICLE: "io.launcher.priority" "Setting process priority"
37 "The priority of the child process can be set by storing one of the below symbols in the " { $snippet "priority" } " slot of a " { $link process } " tuple:"
38 { $list
39     { $link +lowest-priority+ }
40     { $link +low-priority+ }
41     { $link +normal-priority+ }
42     { $link +high-priority+ }
43     { $link +highest-priority+ }
44 }
45 "The default value is " { $link f } ", which denotes that the child process should inherit the current process priority." ;
46
47 HELP: +closed+
48 { $description "Possible value for the " { $snippet "stdin" } ", " { $snippet "stdout" } ", and " { $snippet "stderr" } " slots of a " { $link process } "." } ;
49
50 HELP: +stdout+
51 { $description "Possible value for the " { $snippet "stderr" } " slot of a " { $link process } "." } ;
52
53 HELP: appender
54 { $class-description "An object representing a file to append to. Instances are created with " { $link <appender> } "." } ;
55
56 HELP: <appender>
57 { $values { "path" "a pathname string" } { "appender" appender } }
58 { $description "Creates an object which may be stored in the " { $snippet "stdout" } " or " { $snippet "stderr" } " slot of a " { $link process } " instance." } ;
59
60 HELP: +prepend-environment+
61 { $description "Possible value of " { $snippet "environment-mode" } " slot of a " { $link process } "."
62 $nl
63 "If this value is set, the child process environment consists of the value of the " { $snippet "environment" } " slot together with the current environment, with entries from the current environment taking precedence."
64 $nl
65 "This is used in situations where you want to spawn a child process with some default environment variables set, but allowing the user to override these defaults by changing the environment before launching Factor." } ;
66
67 HELP: +replace-environment+
68 { $description "Possible value of " { $snippet "environment-mode" } " slot of a " { $link process } "."
69 $nl
70 "The child process environment consists of the value of the " { $snippet "environment" } " slot."
71 $nl
72 "This is used in situations where you want full control over a child process environment, perhaps for security or testing." } ;
73
74 HELP: +append-environment+
75 { $description "Possible value of " { $snippet "environment-mode" } " slot of a " { $link process } "."
76 $nl
77 "The child process environment consists of the current environment together with the value of the " { $snippet "environment" } " key, with entries from the " { $snippet "environment" } " key taking precedence."
78 $nl
79 "This is used in situations where you want a spawn child process with some overridden environment variables." } ;
80
81 ARTICLE: "io.launcher.timeouts" "Process run-time timeouts"
82 "The " { $snippet "timeout" } " slot of a " { $link process } " can be set to a " { $link duration } " specifying a maximum running time for the process. If " { $link wait-for-process } " is called and the process does not exit before the duration expires, it will be killed." ;
83
84 HELP: get-environment
85 { $values { "process" process } { "env" "an association" } }
86 { $description "Combines the current environment with the value of the " { $snippet "environment" } " slot of the " { $link process } " using the " { $snippet "environment-mode" } " slot." } ;
87
88 HELP: current-process-handle
89 { $values { "handle" "a process handle" } }
90 { $description "Returns the handle of the current process." } ;
91
92 HELP: run-process*
93 { $values { "process" process } { "handle" "a process handle" } }
94 { $contract "Launches a process." }
95 { $notes "User code should call " { $link run-process } " instead." } ;
96
97 HELP: run-process
98 { $values { "desc" "a launch descriptor" } { "process" process } }
99 { $description "Launches a process. The object can either be a string, a sequence of strings or a " { $link process } ". See " { $link "io.launcher.descriptors" } " for details." }
100 { $notes "The output value can be passed to " { $link wait-for-process } " to get an exit code." } ;
101
102 HELP: run-detached
103 { $values { "desc" "a launch descriptor" } { "process" process } }
104 { $contract "Launches a process without waiting for it to complete. The object can either be a string, a sequence of strings or a " { $link process } ". See " { $link "io.launcher.descriptors" } " for details." }
105 { $notes
106     "This word is functionally identical to passing a " { $link process } " to " { $link run-process } " having the " { $snippet "detached" } " slot set."
107     $nl
108     "The output value can be passed to " { $link wait-for-process } " to get an exit code."
109 } ;
110
111 HELP: process-failed
112 { $values { "code" "an exit status" } }
113 { $description "Throws a " { $link process-failed } " error." }
114 { $error-description "Thrown by " { $link try-process } " if the process exited with a non-zero status code." } ;
115
116 HELP: try-process
117 { $values { "desc" "a launch descriptor" } }
118 { $description "Launches a process and waits for it to complete. If it exits with a non-zero status code, throws a " { $link process-failed } " error." } ;
119
120 { run-process try-process run-detached } related-words
121
122 HELP: kill-process
123 { $values { "process" process } }
124 { $description "Kills a running process. Does nothing if the process has already exited." } ;
125
126 HELP: kill-process*
127 { $values { "handle" "a process handle" } }
128 { $contract "Kills a running process." }
129 { $notes "User code should call " { $link kill-process } " intead." } ;
130
131 HELP: process
132 { $class-description "A class representing a process. Instances are created by calling " { $link <process> } "." } ;
133
134 HELP: <process>
135 { $values { "process" process } }
136 { $description "Creates a new, empty process. It must be filled in before being passed to " { $link run-process } "." } ;
137
138 HELP: <process-stream>
139 { $values
140   { "desc" "a launch descriptor" }
141   { "encoding" "an encoding descriptor" }
142   { "stream" "a bidirectional stream" } }
143 { $description "Launches a process and redirects its input and output via a pair of pipes which may be read and written as a stream of the given encoding." } ;
144
145 HELP: wait-for-process
146 { $values { "process" process } { "status" integer } }
147 { $description "If the process is still running, waits for it to exit, otherwise outputs the exit code immediately. Can be called multiple times on the same process." } ;
148
149 ARTICLE: "io.launcher.descriptors" "Launch descriptors"
150 "Words which launch processes can take either a command line string, a sequence of command line arguments, or a " { $link process } "."
151 $nl
152 "Strings and string arrays are wrapped in a new empty " { $link process } " with the " { $snippet "command" } " slot set. This covers basic use-cases where no launch parameters need to be set."
153 $nl
154 "A " { $link process } " instance can be created directly and passed to launching words for more control. It must be a fresh instance which has never been spawned before. To spawn a process several times from the same descriptor, " { $link clone } " the descriptor first." ;
155
156 ARTICLE: "io.launcher.lifecycle" "The process lifecycle"
157 "A freshly instantiated " { $link process } " represents a set of launch parameters."
158 { $subsection process }
159 { $subsection <process> }
160 "Words for launching processes take a fresh process which has never been started before as input, and output a copy as output."
161 { $subsection process-started? }
162 "The " { $link process } " instance output by launching words contains all original slot values in addition to the " { $snippet "handle" } " slot, which indicates the process is currently running."
163 { $subsection process-running? }
164 "It is possible to wait for a process to exit:"
165 { $subsection wait-for-process }
166 "A running process can also be killed:"
167 { $subsection kill-process } ;
168
169 ARTICLE: "io.launcher.launch" "Launching processes"
170 "Launching processes:"
171 { $subsection run-process }
172 { $subsection try-process }
173 { $subsection run-detached }
174 "Redirecting standard input and output to a pipe:"
175 { $subsection <process-reader> }
176 { $subsection <process-writer> }
177 { $subsection <process-stream> } ;
178
179 ARTICLE: "io.launcher.examples" "Launcher examples"
180 "Starting a command and waiting for it to finish:"
181 { $code
182     "\"ls /etc\" run-process"
183 }
184 "Starting a program in the background:"
185 { $code
186     "{ \"emacs\" \"foo.txt\" } run-detached"
187 }
188 "Running a command, throwing an exception if it exits unsuccessfully:"
189 { $code
190     "\"make clean all\" try-process"
191 }
192 "Running a command, throwing an exception if it exits unsuccessfully or if it takes too long to run:"
193 { $code
194     "<process>"
195     "    \"make test\" >>command"
196     "    5 minutes >>timeout"
197     "try-process"
198 }
199 "Running a command, throwing an exception if it exits unsuccessfully, and redirecting output and error messages to a log file:"
200 { $code
201     "<process>"
202     "    \"make clean all\" >>command"
203     "    \"log.txt\" >>stdout"
204     "    +stdout+ >>stderr"
205     "try-process"
206 }
207 "Running a command, appending error messages to a log file, and reading the output for further processing:"
208 { $code
209     "\"log.txt\" <file-appender> ["
210     "    <process>"
211     "        swap >>stderr"
212     "        \"report\" >>command"
213     "    ascii <process-reader> lines sort reverse [ print ] each"
214     "] with-disposal"
215 } ;
216
217 ARTICLE: "io.launcher" "Operating system processes"
218 "The " { $vocab-link "io.launcher" } " vocabulary implements cross-platform process launching."
219 { $subsection "io.launcher.examples" }
220 { $subsection "io.launcher.descriptors" }
221 { $subsection "io.launcher.launch" }
222 "Advanced topics:"
223 { $subsection "io.launcher.lifecycle" }
224 { $subsection "io.launcher.command" }
225 { $subsection "io.launcher.detached" }
226 { $subsection "io.launcher.environment" }
227 { $subsection "io.launcher.redirection" }
228 { $subsection "io.launcher.priority" }
229 { $subsection "io.launcher.timeouts" } ;
230
231 ABOUT: "io.launcher"