Allow controlling services.
[nssm.git] / README.txt
1 NSSM: The Non-Sucking Service Manager\r
2 Version 2.21, 2013-11-24\r
3 \r
4 NSSM is a service helper program similar to srvany and cygrunsrv.  It can \r
5 start any application as an NT service and will restart the service if it \r
6 fails for any reason.\r
7 \r
8 NSSM also has a graphical service installer and remover.\r
9 \r
10 Full documentation can be found online at\r
11 \r
12                               http://nssm.cc/\r
13 \r
14 Since version 2.0, the GUI can be bypassed by entering all appropriate \r
15 options on the command line.\r
16 \r
17 Since version 2.1, NSSM can be compiled for x64 platforms.\r
18 Thanks Benjamin Mayrargue.\r
19 \r
20 Since version 2.2, NSSM can be configured to take different actions\r
21 based on the exit code of the managed application.\r
22 \r
23 Since version 2.3, NSSM logs to the Windows event log more elegantly.\r
24 \r
25 Since version 2.5, NSSM respects environment variables in its parameters.\r
26 \r
27 Since version 2.8, NSSM tries harder to shut down the managed application\r
28 gracefully and throttles restart attempts if the application doesn't run\r
29 for a minimum amount of time.\r
30 \r
31 Since version 2.11, NSSM respects srvany's AppEnvironment parameter.\r
32 \r
33 Since version 2.13, NSSM is translated into French.\r
34 Thanks François-Régis Tardy.\r
35 \r
36 Since version 2.15, NSSM is translated into Italian.\r
37 Thanks Riccardo Gusmeroli.\r
38 \r
39 Since version 2.17, NSSM can try to shut down console applications by\r
40 simulating a Control-C keypress.  If they have installed a handler routine\r
41 they can clean up and shut down gracefully on receipt of the event.\r
42 \r
43 Since version 2.17, NSSM can redirect the managed application's I/O streams\r
44 to an arbitrary path.\r
45 \r
46 Since version 2.18, NSSM can be configured to wait a user-specified amount\r
47 of time for the application to exit when shutting down.\r
48 \r
49 Since version 2.19, many more service options can be configured with the\r
50 GUI installer as well as via the registry.\r
51 \r
52 Since version 2.19, NSSM can add to the service's environment by setting\r
53 AppEnvironmentExtra in place of or in addition to the srvany-compatible\r
54 AppEnvironment.\r
55 \r
56 Since version 2.22, NSSM can rotate existing output files when redirecting I/O.\r
57 \r
58 Since version 2.22, NSSM can set service display name, description, startup\r
59 type and log on details.\r
60 \r
61 Since version 2.22, NSSM can manage existing services.\r
62 \r
63 \r
64 Usage\r
65 -----\r
66 In the usage notes below, arguments to the program may be written in angle \r
67 brackets and/or square brackets.  <string> means you must insert the \r
68 appropriate string and [<string>] means the string is optional.  See the \r
69 examples below...\r
70 \r
71 \r
72 Installation using the GUI\r
73 --------------------------\r
74 To install a service, run\r
75 \r
76     nssm install <servicename>\r
77 \r
78 You will be prompted to enter the full path to the application you wish \r
79 to run and any command line options to pass to that application.\r
80 \r
81 Use the system service manager (services.msc) to control advanced service \r
82 properties such as startup method and desktop interaction.  NSSM may \r
83 support these options at a later time...\r
84 \r
85 \r
86 Installation using the command line\r
87 -----------------------------------\r
88 To install a service, run\r
89 \r
90     nssm install <servicename> <application> [<options>]\r
91 \r
92 NSSM will then attempt to install a service which runs the named application \r
93 with the given options (if you specified any).\r
94 \r
95 Don't forget to enclose paths in "quotes" if they contain spaces!\r
96 \r
97 If you want to include quotes in the options you will need to """quote""" the\r
98 quotes.\r
99 \r
100 \r
101 Managing the service\r
102 --------------------\r
103 NSSM will launch the application listed in the registry when you send it a \r
104 start signal and will terminate it when you send a stop signal.  So far, so \r
105 much like srvany.  But NSSM is the Non-Sucking service manager and can take \r
106 action if/when the application dies.\r
107 \r
108 With no configuration from you, NSSM will try to restart itself if it notices\r
109 that the application died but you didn't send it a stop signal.  NSSM will\r
110 keep trying, pausing between each attempt, until the service is successfully\r
111 started or you send it a stop signal.\r
112 \r
113 NSSM will pause an increasingly longer time between subsequent restart attempts\r
114 if the service fails to start in a timely manner, up to a maximum of four\r
115 minutes.  This is so it does not consume an excessive amount of CPU time trying\r
116 to start a failed application over and over again.  If you identify the cause\r
117 of the failure and don't want to wait you can use the Windows service console\r
118 (where the service will be shown in Paused state) to send a continue signal to\r
119 NSSM and it will retry within a few seconds.\r
120 \r
121 By default, NSSM defines "a timely manner" to be within 1500 milliseconds.\r
122 You can change the threshold for the service by setting the number of\r
123 milliseconds as a REG_DWORD value in the registry at\r
124 HKLM\SYSTEM\CurrentControlSet\Services\<service>\Parameters\AppThrottle.\r
125 \r
126 NSSM will look in the registry under\r
127 HKLM\SYSTEM\CurrentControlSet\Services\<service>\Parameters\AppExit for\r
128 string (REG_EXPAND_SZ) values corresponding to the exit code of the application.\r
129 If the application exited with code 1, for instance, NSSM will look for a\r
130 string value under AppExit called "1" or, if it does not find it, will\r
131 fall back to the AppExit (Default) value.  You can find out the exit code\r
132 for the application by consulting the system event log.  NSSM will log the\r
133 exit code when the application exits.\r
134 \r
135 Based on the data found in the registry, NSSM will take one of three actions:\r
136 \r
137 If the value data is "Restart" NSSM will try to restart the application as\r
138 described above.  This is its default behaviour.\r
139 \r
140 If the value data is "Ignore" NSSM will not try to restart the application\r
141 but will continue running itself.  This emulates the (usually undesirable)\r
142 behaviour of srvany.  The Windows Services console would show the service\r
143 as still running even though the application has exited.\r
144 \r
145 If the value data is "Exit" NSSM will exit gracefully.  The Windows Services\r
146 console would show the service as stopped.  If you wish to provide\r
147 finer-grained control over service recovery you should use this code and\r
148 edit the failure action manually.  Please note that Windows versions prior\r
149 to Vista will not consider such an exit to be a failure.  On older versions\r
150 of Windows you should use "Suicide" instead.\r
151 \r
152 If the value data is "Suicide" NSSM will simulate a crash and exit without\r
153 informing the service manager.  This option should only be used for\r
154 pre-Vista systems where you wish to apply a service recovery action.  Note\r
155 that if the monitored application exits with code 0, NSSM will only honour a\r
156 request to suicide if you explicitly configure a registry key for exit code 0.\r
157 If only the default action is set to Suicide NSSM will instead exit gracefully.\r
158 \r
159 \r
160 Stopping the service\r
161 --------------------\r
162 When stopping a service NSSM will attempt several different methods of killing\r
163 the monitored application, each of which can be disabled if necessary.\r
164 \r
165 First NSSM will attempt to generate a Control-C event and send it to the\r
166 application's console.  Batch scripts or console applications may intercept\r
167 the event and shut themselves down gracefully.  GUI applications do not have\r
168 consoles and will not respond to this method.\r
169 \r
170 Secondly NSSM will enumerate all windows created by the application and send\r
171 them a WM_CLOSE message, requesting a graceful exit.\r
172 \r
173 Thirdly NSSM will enumerate all threads created by the application and send\r
174 them a WM_QUIT message, requesting a graceful exit.  Not all applications'\r
175 threads have message queues; those which do not will not respond to this\r
176 method.\r
177 \r
178 Finally NSSM will call TerminateProcess() to request that the operating\r
179 system forcibly terminate the application.  TerminateProcess() cannot be\r
180 trapped or ignored, so in most circumstances the application will be killed.\r
181 However, there is no guarantee that it will have a chance to perform any\r
182 tidyup operations before it exits.\r
183 \r
184 Any or all of the methods above may be disabled.  NSSM will look for the\r
185 HKLM\SYSTEM\CurrentControlSet\Services\<service>\Parameters\AppStopMethodSkip\r
186 registry value which should be of type REG_DWORD set to a bit field describing\r
187 which methods should not be applied.\r
188 \r
189   If AppStopMethodSkip includes 1, Control-C events will not be generated.\r
190   If AppStopMethodSkip includes 2, WM_CLOSE messages will not be posted.\r
191   If AppStopMethodSkip includes 4, WM_QUIT messages will not be posted.\r
192   If AppStopMethodSkip includes 8, TerminateProcess() will not be called.\r
193 \r
194 If, for example, you knew that an application did not respond to Control-C\r
195 events and did not have a thread message queue, you could set AppStopMethodSkip\r
196 to 5 and NSSM would not attempt to use those methods to stop the application.\r
197 \r
198 Take great care when including 8 in the value of AppStopMethodSkip.  If NSSM\r
199 does not call TerminateProcess() it is possible that the application will not\r
200 exit when the service stops.\r
201 \r
202 By default NSSM will allow processes 1500ms to respond to each of the methods\r
203 described above before proceeding to the next one.  The timeout can be\r
204 configured on a per-method basis by creating REG_DWORD entries in the\r
205 registry under HKLM\SYSTEM\CurrentControlSet\Services\<service>\Parameters.\r
206 \r
207   AppStopMethodConsole\r
208   AppStopMethodWindow\r
209   AppStopMethodThreads\r
210 \r
211 Each value should be set to the number of milliseconds to wait.  Please note\r
212 that the timeout applies to each process in the application's process tree,\r
213 so the actual time to shutdown may be longer than the sum of all configured\r
214 timeouts if the application spawns multiple subprocesses.\r
215 \r
216 \r
217 I/O redirection\r
218 ---------------\r
219 NSSM can redirect the managed application's I/O to any path capable of being\r
220 opened by CreateFile().  This enables, for example, capturing the log output\r
221 of an application which would otherwise only write to the console or accepting\r
222 input from a serial port.\r
223 \r
224 NSSM will look in the registry under\r
225 HKLM\SYSTEM\CurrentControlSet\Services\<service>\Parameters for the keys\r
226 corresponding to arguments to CreateFile().  All are optional.  If no path is\r
227 given for a particular stream it will not be redirected.  If a path is given\r
228 but any of the other values are omitted they will be receive sensible defaults.\r
229 \r
230   AppStdin: Path to receive input.\r
231   AppStdout: Path to receive output.\r
232   AppStderr: Path to receive error output.\r
233 \r
234 Parameters for CreateFile() are providing with the "AppStdinShareMode",\r
235 "AppStdinCreationDisposition" and "AppStdinFlagsAndAttributes" values (and\r
236 analogously for stdout and stderr).\r
237 \r
238 In general, if you want the service to log its output, set AppStdout and\r
239 AppStderr to the same path, eg C:\Users\Public\service.log, and it should\r
240 work.  Remember, however, that the path must be accessible to the user\r
241 running the service.\r
242 \r
243 \r
244 File rotation\r
245 -------------\r
246 When using I/O redirection, NSSM can rotate existing output files prior to\r
247 opening stdout and/or stderr.  An existing file will be renamed with a\r
248 suffix based on the file's last write time, to millisecond precision.  For\r
249 example, the file nssm.log might be rotated to nssm-20131221T113939.457.log.\r
250 \r
251 NSSM will look in the registry under\r
252 HKLM\SYSTEM\CurrentControlSet\Services\<service>\Parameters for REG_DWORD\r
253 entries which control how rotation happens.\r
254 \r
255 If AppRotateFiles is missing or set to 0, rotation is disabled.  Any non-zero\r
256 value enables rotation.\r
257 \r
258 If AppRotateSeconds is non-zero, a file will not be rotated if its last write\r
259 time is less than the given number of seconds in the past.\r
260 \r
261 If AppRotateBytes is non-zero, a file will not be rotated if it is smaller\r
262 than the given number of bytes.  64-bit file sizes can be handled by setting\r
263 a non-zero value of AppRotateBytesHigh.\r
264 \r
265 Rotation is independent of the CreateFile() parameters used to open the files.\r
266 They will be rotated regardless of whether NSSM would otherwise have appended\r
267 or replaced them.\r
268 \r
269 \r
270 Environment variables\r
271 ---------------------\r
272 NSSM can replace or append to the managed application's environment.  Two\r
273 multi-valued string (REG_MULTI_SZ) registry values are recognised under\r
274 HKLM\SYSTEM\CurrentControlSet\Services\<service>\Parameters.\r
275 \r
276 AppEnvironment defines a list of environment variables which will override\r
277 the service's environment.  AppEnvironmentExtra defines a list of\r
278 environment variables which will be added to the service's environment.\r
279 \r
280 Each entry in the list should be of the form KEY=VALUE.  It is possible to\r
281 omit the VALUE but the = symbol is mandatory.\r
282 \r
283 srvany only supports AppEnvironment.\r
284 \r
285 \r
286 Managing services using the GUI\r
287 -------------------------------\r
288 NSSM can edit the settings of existing services with the same GUI that is\r
289 used to install them.  Run\r
290 \r
291     nssm edit <servicename>\r
292 \r
293 to bring up the GUI.\r
294 \r
295 NSSM offers limited editing capabilities for services other than those which\r
296 run NSSM itself.  When NSSM is asked to edit a service which does not have\r
297 the App* registry settings described above, the GUI will allow editing only\r
298 system settings such as the service display name and description.\r
299 \r
300 \r
301 Managing services using the command line\r
302 ----------------------------------------\r
303 NSSM can retrieve or set individual service parameters from the command line.\r
304 In general the syntax is as follows, though see below for exceptions.\r
305 \r
306     nssm get <servicename> <parameter>\r
307 \r
308     nssm set <servicename> <parameter> <value>\r
309 \r
310 Parameters can also be reset to their default values.\r
311 \r
312     nssm reset <servicename> <parameter>\r
313 \r
314 The parameter names recognised by NSSM are the same as the registry entry\r
315 names described above, eg AppDirectory.\r
316 \r
317 NSSM offers limited editing capabilities for Services other than those which\r
318 run NSSM itself.  The parameters recognised are as follows:\r
319 \r
320   Description: Service description.\r
321   DisplayName: Service display name.\r
322   ImagePath: Path to the service executable.\r
323   ObjectName: User account which runs the service.\r
324   Start: Service startup type.\r
325   Type: Service type.\r
326 \r
327 These correspond to the registry values under the service's key\r
328 HKLM\SYSTEM\CurrentControlSet\Services\<service>.\r
329 \r
330 \r
331 Note that NSSM will concatenate all arguments passed on the command line\r
332 with spaces to form the value to set.  Thus the following two invocations\r
333 would have the same effect.\r
334 \r
335     nssm set <servicename> Description "NSSM managed service"\r
336 \r
337     nssm set <servicename> Description NSSM managed service\r
338 \r
339 \r
340 Non-standard parameters\r
341 -----------------------\r
342 The AppEnvironment and AppEnvironmentExtra parameters recognise an\r
343 additional argument when querying the environment.  The following syntax\r
344 will print all extra environment variables configured for a service\r
345 \r
346     nssm get <servicename> AppEnvironmentExtra\r
347 \r
348 whereas the syntax below will print only the value of the CLASSPATH\r
349 variable if it is configured in the environment block, or the empty string\r
350 if it is not configured.\r
351 \r
352     nssm get <servicename> AppEnvironmentExtra CLASSPATH\r
353 \r
354 When setting an environment block, each variable should be specified as a\r
355 KEY=VALUE pair in separate command line arguments.  For example:\r
356 \r
357     nssm set <servicename> AppEnvironment CLASSPATH=C:\Classes TEMP=C:\Temp\r
358 \r
359 \r
360 The AppExit parameter requires an additional argument specifying the exit\r
361 code to get or set.  The default action can be specified with the string\r
362 Default.\r
363 \r
364 For example, to get the default exit action for a service you should run\r
365 \r
366     nssm get <servicename> AppExit Default\r
367 \r
368 To get the exit action when the application exits with exit code 2, run\r
369 \r
370     nssm get <servicename> AppExit 2\r
371 \r
372 Note that if no explicit action is configured for a specified exit code,\r
373 NSSM will print the default exit action.\r
374 \r
375 To set configure the service to stop when the application exits with an\r
376 exit code of 2, run\r
377 \r
378     nssm set <servicename> AppExit 2 Exit\r
379 \r
380 \r
381 The ObjectName parameter requires an additional argument only when setting\r
382 a username.  The additional argument is the password of the user.\r
383 \r
384 To retrieve the username, run\r
385 \r
386     nssm get <servicename> ObjectName\r
387 \r
388 To set the username and password, run\r
389 \r
390     nssm set <servicename> ObjectName <username> <password>\r
391 \r
392 Note that the rules of argument concatenation still apply.  The following\r
393 invocation is valid and will have the expected effect.\r
394 \r
395     nssm set <servicename> ObjectName <username> correct horse battery staple\r
396 \r
397 \r
398 The Start parameter is used to query or set the startup type of the service.\r
399 Valid service startup types are as follows:\r
400 \r
401   SERVICE_AUTO_START: Automatic startup at boot.\r
402   SERVICE_DELAYED_START: Delayed startup at boot.\r
403   SERVICE_DEMAND_START: Manual service startup.\r
404   SERVICE_DISABLED: The service is disabled.\r
405 \r
406 Note that SERVICE_DELAYED_START is not supported on versions of Windows prior\r
407 to Vista.  NSSM will set the service to automatic startup if delayed start is\r
408 unavailable.\r
409 \r
410 \r
411 The Type parameter is used to query or set the service type.  NSSM recognises\r
412 all currently documented service types but will only allow setting one of two\r
413 types:\r
414 \r
415   SERVICE_WIN32_OWN_PROCESS: A standalone service.  This is the default.\r
416   SERVICE_INTERACTIVE_PROCESS: A service which can interact with the desktop.\r
417 \r
418 Note that a service may only be configured as interactive if it runs under\r
419 the LocalSystem account.  The safe way to configure an interactive service\r
420 is in two stages as follows.\r
421 \r
422     nssm reset <servicename> ObjectName\r
423     nssm set <servicename> Type SERVICE_INTERACTIVE_PROCESS\r
424 \r
425 \r
426 Controlling services using the command line\r
427 -------------------------------------------\r
428 NSSM offers rudimentary service control features.\r
429 \r
430     nssm start <servicename>\r
431 \r
432     nssm stop <servicename>\r
433 \r
434     nssm status <servicename>\r
435 \r
436 \r
437 Removing services using the GUI\r
438 -------------------------------\r
439 NSSM can also remove services.  Run\r
440 \r
441     nssm remove <servicename>\r
442 \r
443 to remove a service.  You will prompted for confirmation before the service \r
444 is removed.  Try not to remove essential system services...\r
445 \r
446 \r
447 Removing service using the command line\r
448 ---------------------------------------\r
449 To remove a service without confirmation from the GUI, run\r
450 \r
451     nssm remove <servicename> confirm\r
452 \r
453 Try not to remove essential system services...\r
454 \r
455 \r
456 Logging\r
457 -------\r
458 NSSM logs to the Windows event log.  It registers itself as an event log source\r
459 and uses unique event IDs for each type of message it logs.  New versions may\r
460 add event types but existing event IDs will never be changed.\r
461 \r
462 Because of the way NSSM registers itself you should be aware that you may not\r
463 be able to replace the NSSM binary if you have the event viewer open and that\r
464 running multiple instances of NSSM from different locations may be confusing if\r
465 they are not all the same version.\r
466 \r
467 \r
468 Example usage\r
469 -------------\r
470 To install an Unreal Tournament server:\r
471 \r
472     nssm install UT2004 c:\games\ut2004\system\ucc.exe server\r
473 \r
474 To run the server as the "games" user:\r
475 \r
476     nssm set UT2004 ObjectName games password\r
477 \r
478 To configure the server to log to a file:\r
479 \r
480     nssm set UT2004 AppStdout c:\games\ut2004\service.log\r
481 \r
482 To remove the server:\r
483 \r
484     nssm remove UT2004 confirm\r
485 \r
486 \r
487 Building NSSM from source\r
488 -------------------------\r
489 NSSM is known to compile with Visual Studio 2008.  Older Visual Studio\r
490 releases may or may not work.\r
491 \r
492 NSSM will also compile with Visual Studio 2010 but the resulting executable\r
493 will not run on versions of Windows older than XP SP2.  If you require\r
494 compatiblity with older Windows releases you should change the Platform\r
495 Toolset to v90 in the General section of the project's Configuration\r
496 Properties.\r
497 \r
498 \r
499 Credits\r
500 -------\r
501 Thanks to Bernard Loh for finding a bug with service recovery.\r
502 Thanks to Benjamin Mayrargue (www.softlion.com) for adding 64-bit support.\r
503 Thanks to Joel Reingold for spotting a command line truncation bug.\r
504 Thanks to Arve Knudsen for spotting that child processes of the monitored\r
505 application could be left running on service shutdown, and that a missing\r
506 registry value for AppDirectory confused NSSM.\r
507 Thanks to Peter Wagemans and Laszlo Keresztfalvi for suggesting throttling restarts.\r
508 Thanks to Eugene Lifshitz for finding an edge case in CreateProcess() and for\r
509 advising how to build messages.mc correctly in paths containing spaces.\r
510 Thanks to Rob Sharp for pointing out that NSSM did not respect the\r
511 AppEnvironment registry value used by srvany.\r
512 Thanks to Szymon Nowak for help with Windows 2000 compatibility.\r
513 Thanks to François-Régis Tardy for French translation.\r
514 Thanks to Emilio Frini for spotting that French was inadvertently set as\r
515 the default language when the user's display language was not translated.\r
516 Thanks to Riccardo Gusmeroli for Italian translation.\r
517 Thanks to Eric Cheldelin for the inspiration to generate a Control-C event\r
518 on shutdown.\r
519 Thanks to Brian Baxter for suggesting how to escape quotes from the command prompt.\r
520 Thanks to Russ Holmann for suggesting that the shutdown timeout be configurable.\r
521 Thanks to Paul Spause for spotting a bug with default registry entries.\r
522 Thanks to BUGHUNTER for spotting more GUI bugs.\r
523 Thanks to Doug Watson for suggesting file rotation.\r
524 \r
525 Licence\r
526 -------\r
527 NSSM is public domain.  You may unconditionally use it and/or its source code \r
528 for any purpose you wish.\r