Command to dump service configuration.
[nssm.git] / README.txt
1 NSSM: The Non-Sucking Service Manager\r
2 Version 2.24, 2014-08-31\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 set the managed application's process priority\r
57 and CPU affinity.\r
58 \r
59 Since version 2.22, NSSM can apply an unconditional delay before restarting\r
60 an application which has exited.\r
61 \r
62 Since version 2.22, NSSM can rotate existing output files when redirecting I/O.\r
63 \r
64 Since version 2.22, NSSM can set service display name, description, startup\r
65 type, log on details and dependencies.\r
66 \r
67 Since version 2.22, NSSM can manage existing services.\r
68 \r
69 Since version 2.25, NSSM can execute commands in response to service events.\r
70 \r
71 Since version 2.25, NSSM can list services it manages.\r
72 \r
73 Since version 2.25, NSSM can dump the configuration of services it manages.\r
74 \r
75 \r
76 Usage\r
77 -----\r
78 In the usage notes below, arguments to the program may be written in angle\r
79 brackets and/or square brackets.  <string> means you must insert the\r
80 appropriate string and [<string>] means the string is optional.  See the\r
81 examples below...\r
82 \r
83 Note that everywhere <servicename> appears you may substitute the\r
84 service's display name.\r
85 \r
86 \r
87 Installation using the GUI\r
88 --------------------------\r
89 To install a service, run\r
90 \r
91     nssm install <servicename>\r
92 \r
93 You will be prompted to enter the full path to the application you wish \r
94 to run and any command line options to pass to that application.\r
95 \r
96 Use the system service manager (services.msc) to control advanced service \r
97 properties such as startup method and desktop interaction.  NSSM may \r
98 support these options at a later time...\r
99 \r
100 \r
101 Installation using the command line\r
102 -----------------------------------\r
103 To install a service, run\r
104 \r
105     nssm install <servicename> <application> [<options>]\r
106 \r
107 NSSM will then attempt to install a service which runs the named application \r
108 with the given options (if you specified any).\r
109 \r
110 Don't forget to enclose paths in "quotes" if they contain spaces!\r
111 \r
112 If you want to include quotes in the options you will need to """quote""" the\r
113 quotes.\r
114 \r
115 \r
116 Managing the service\r
117 --------------------\r
118 NSSM will launch the application listed in the registry when you send it a \r
119 start signal and will terminate it when you send a stop signal.  So far, so \r
120 much like srvany.  But NSSM is the Non-Sucking service manager and can take \r
121 action if/when the application dies.\r
122 \r
123 With no configuration from you, NSSM will try to restart itself if it notices\r
124 that the application died but you didn't send it a stop signal.  NSSM will\r
125 keep trying, pausing between each attempt, until the service is successfully\r
126 started or you send it a stop signal.\r
127 \r
128 NSSM will pause an increasingly longer time between subsequent restart attempts\r
129 if the service fails to start in a timely manner, up to a maximum of four\r
130 minutes.  This is so it does not consume an excessive amount of CPU time trying\r
131 to start a failed application over and over again.  If you identify the cause\r
132 of the failure and don't want to wait you can use the Windows service console\r
133 (where the service will be shown in Paused state) to send a continue signal to\r
134 NSSM and it will retry within a few seconds.\r
135 \r
136 By default, NSSM defines "a timely manner" to be within 1500 milliseconds.\r
137 You can change the threshold for the service by setting the number of\r
138 milliseconds as a REG_DWORD value in the registry at\r
139 HKLM\SYSTEM\CurrentControlSet\Services\<service>\Parameters\AppThrottle.\r
140 \r
141 Alternatively, NSSM can pause for a configurable amount of time before\r
142 attempting to restart the application even if it successfully ran for the\r
143 amount of time specified by AppThrottle.  NSSM will consult the REG_DWORD value\r
144 at HKLM\SYSTEM\CurrentControlSet\Services\<service>\Parameters\AppRestartDelay\r
145 for the number of milliseconds to wait before attempting a restart.  If\r
146 AppRestartDelay is set and the application is determined to be subject to\r
147 throttling, NSSM will pause the service for whichever is longer of the\r
148 configured restart delay and the calculated throttle period.\r
149 \r
150 If AppRestartDelay is missing or invalid, only throttling will be applied.\r
151 \r
152 NSSM will look in the registry under\r
153 HKLM\SYSTEM\CurrentControlSet\Services\<service>\Parameters\AppExit for\r
154 string (REG_EXPAND_SZ) values corresponding to the exit code of the application.\r
155 If the application exited with code 1, for instance, NSSM will look for a\r
156 string value under AppExit called "1" or, if it does not find it, will\r
157 fall back to the AppExit (Default) value.  You can find out the exit code\r
158 for the application by consulting the system event log.  NSSM will log the\r
159 exit code when the application exits.\r
160 \r
161 Based on the data found in the registry, NSSM will take one of three actions:\r
162 \r
163 If the value data is "Restart" NSSM will try to restart the application as\r
164 described above.  This is its default behaviour.\r
165 \r
166 If the value data is "Ignore" NSSM will not try to restart the application\r
167 but will continue running itself.  This emulates the (usually undesirable)\r
168 behaviour of srvany.  The Windows Services console would show the service\r
169 as still running even though the application has exited.\r
170 \r
171 If the value data is "Exit" NSSM will exit gracefully.  The Windows Services\r
172 console would show the service as stopped.  If you wish to provide\r
173 finer-grained control over service recovery you should use this code and\r
174 edit the failure action manually.  Please note that Windows versions prior\r
175 to Vista will not consider such an exit to be a failure.  On older versions\r
176 of Windows you should use "Suicide" instead.\r
177 \r
178 If the value data is "Suicide" NSSM will simulate a crash and exit without\r
179 informing the service manager.  This option should only be used for\r
180 pre-Vista systems where you wish to apply a service recovery action.  Note\r
181 that if the monitored application exits with code 0, NSSM will only honour a\r
182 request to suicide if you explicitly configure a registry key for exit code 0.\r
183 If only the default action is set to Suicide NSSM will instead exit gracefully.\r
184 \r
185 \r
186 Application priority\r
187 --------------------\r
188 NSSM can set the priority class of the managed application.  NSSM will look in\r
189 the registry under HKLM\SYSTEM\CurrentControlSet\Services\<service>\Parameters\r
190 for the REG_DWORD entry AppPriority.  Valid values correspond to arguments to\r
191 SetPriorityClass().  If AppPriority() is missing or invalid the\r
192 application will be launched with normal priority.\r
193 \r
194 \r
195 Processor affinity\r
196 ------------------\r
197 NSSM can set the CPU affinity of the managed application.  NSSM will look in\r
198 the registry under HKLM\SYSTEM\CurrentControlSet\Services\<service>\Parameters\r
199 for the REG_SZ entry AppAffinity.   It should specify a comma-separated listed\r
200 of zero-indexed processor IDs.  A range of processors may optionally be\r
201 specified with a dash.  No other characters are allowed in the string.\r
202 \r
203 For example, to specify the first; second; third and fifth CPUs, an appropriate\r
204 AppAffinity would be 0-2,4.\r
205 \r
206 If AppAffinity is missing or invalid, NSSM will not attempt to restrict the\r
207 application to specific CPUs.\r
208 \r
209 Note that the 64-bit version of NSSM can configure a maximum of 64 CPUs in this\r
210 way and that the 32-bit version can configure a maxium of 32 CPUs even when\r
211 running on 64-bit Windows.\r
212 \r
213 \r
214 Stopping the service\r
215 --------------------\r
216 When stopping a service NSSM will attempt several different methods of killing\r
217 the monitored application, each of which can be disabled if necessary.\r
218 \r
219 First NSSM will attempt to generate a Control-C event and send it to the\r
220 application's console.  Batch scripts or console applications may intercept\r
221 the event and shut themselves down gracefully.  GUI applications do not have\r
222 consoles and will not respond to this method.\r
223 \r
224 Secondly NSSM will enumerate all windows created by the application and send\r
225 them a WM_CLOSE message, requesting a graceful exit.\r
226 \r
227 Thirdly NSSM will enumerate all threads created by the application and send\r
228 them a WM_QUIT message, requesting a graceful exit.  Not all applications'\r
229 threads have message queues; those which do not will not respond to this\r
230 method.\r
231 \r
232 Finally NSSM will call TerminateProcess() to request that the operating\r
233 system forcibly terminate the application.  TerminateProcess() cannot be\r
234 trapped or ignored, so in most circumstances the application will be killed.\r
235 However, there is no guarantee that it will have a chance to perform any\r
236 tidyup operations before it exits.\r
237 \r
238 Any or all of the methods above may be disabled.  NSSM will look for the\r
239 HKLM\SYSTEM\CurrentControlSet\Services\<service>\Parameters\AppStopMethodSkip\r
240 registry value which should be of type REG_DWORD set to a bit field describing\r
241 which methods should not be applied.\r
242 \r
243   If AppStopMethodSkip includes 1, Control-C events will not be generated.\r
244   If AppStopMethodSkip includes 2, WM_CLOSE messages will not be posted.\r
245   If AppStopMethodSkip includes 4, WM_QUIT messages will not be posted.\r
246   If AppStopMethodSkip includes 8, TerminateProcess() will not be called.\r
247 \r
248 If, for example, you knew that an application did not respond to Control-C\r
249 events and did not have a thread message queue, you could set AppStopMethodSkip\r
250 to 5 and NSSM would not attempt to use those methods to stop the application.\r
251 \r
252 Take great care when including 8 in the value of AppStopMethodSkip.  If NSSM\r
253 does not call TerminateProcess() it is possible that the application will not\r
254 exit when the service stops.\r
255 \r
256 By default NSSM will allow processes 1500ms to respond to each of the methods\r
257 described above before proceeding to the next one.  The timeout can be\r
258 configured on a per-method basis by creating REG_DWORD entries in the\r
259 registry under HKLM\SYSTEM\CurrentControlSet\Services\<service>\Parameters.\r
260 \r
261   AppStopMethodConsole\r
262   AppStopMethodWindow\r
263   AppStopMethodThreads\r
264 \r
265 Each value should be set to the number of milliseconds to wait.  Please note\r
266 that the timeout applies to each process in the application's process tree,\r
267 so the actual time to shutdown may be longer than the sum of all configured\r
268 timeouts if the application spawns multiple subprocesses.\r
269 \r
270 To skip applying the above stop methods to all processes in the application's\r
271 process tree, applying them only to the original application process, set the\r
272 HKLM\SYSTEM\CurrentControlSet\Services\<service>\Parameters\AppKillProcessTree\r
273 registry value, which should be of type REG_DWORD, to 0.\r
274 \r
275 \r
276 Console window\r
277 --------------\r
278 By default, NSSM will create a console window so that applications which\r
279 are capable of reading user input can do so - subject to the service being\r
280 allowed to interact with the desktop.\r
281 \r
282 Creation of the console can be suppressed by setting the integer (REG_DWORD)\r
283 HKLM\SYSTEM\CurrentControlSet\Services\<service>\Parameters\AppNoConsole\r
284 registry value to 1.\r
285 \r
286 \r
287 I/O redirection\r
288 ---------------\r
289 NSSM can redirect the managed application's I/O to any path capable of being\r
290 opened by CreateFile().  This enables, for example, capturing the log output\r
291 of an application which would otherwise only write to the console or accepting\r
292 input from a serial port.\r
293 \r
294 NSSM will look in the registry under\r
295 HKLM\SYSTEM\CurrentControlSet\Services\<service>\Parameters for the keys\r
296 corresponding to arguments to CreateFile().  All are optional.  If no path is\r
297 given for a particular stream it will not be redirected.  If a path is given\r
298 but any of the other values are omitted they will be receive sensible defaults.\r
299 \r
300   AppStdin: Path to receive input.\r
301   AppStdout: Path to receive output.\r
302   AppStderr: Path to receive error output.\r
303 \r
304 Parameters for CreateFile() are providing with the "AppStdinShareMode",\r
305 "AppStdinCreationDisposition" and "AppStdinFlagsAndAttributes" values (and\r
306 analogously for stdout and stderr).\r
307 \r
308 In general, if you want the service to log its output, set AppStdout and\r
309 AppStderr to the same path, eg C:\Users\Public\service.log, and it should\r
310 work.  Remember, however, that the path must be accessible to the user\r
311 running the service.\r
312 \r
313 \r
314 File rotation\r
315 -------------\r
316 When using I/O redirection, NSSM can rotate existing output files prior to\r
317 opening stdout and/or stderr.  An existing file will be renamed with a\r
318 suffix based on the file's last write time, to millisecond precision.  For\r
319 example, the file nssm.log might be rotated to nssm-20131221T113939.457.log.\r
320 \r
321 NSSM will look in the registry under\r
322 HKLM\SYSTEM\CurrentControlSet\Services\<service>\Parameters for REG_DWORD\r
323 entries which control how rotation happens.\r
324 \r
325 If AppRotateFiles is missing or set to 0, rotation is disabled.  Any non-zero\r
326 value enables rotation.\r
327 \r
328 If AppRotateSeconds is non-zero, a file will not be rotated if its last write\r
329 time is less than the given number of seconds in the past.\r
330 \r
331 If AppRotateBytes is non-zero, a file will not be rotated if it is smaller\r
332 than the given number of bytes.  64-bit file sizes can be handled by setting\r
333 a non-zero value of AppRotateBytesHigh.\r
334 \r
335 If AppRotateDelay is non-zero, NSSM will pause for the given number of\r
336 milliseconds after rotation.\r
337 \r
338 If AppStdoutCopyAndTruncate or AppStderrCopyAndTruncate are non-zero, the\r
339 stdout (or stderr respectively) file will be rotated by first taking a copy\r
340 of the file then truncating the original file to zero size.  This allows\r
341 NSSM to rotate files which are held open by other processes, preventing the\r
342 usual MoveFile() from succeeding.  Note that the copy process may take some\r
343 time if the file is large, and will temporarily consume twice as much disk\r
344 space as the original file.  Note also that applications reading the log file\r
345 may not notice that the file size changed.  Using this option in conjunction\r
346 with AppRotateDelay may help in that case.\r
347 \r
348 Rotation is independent of the CreateFile() parameters used to open the files.\r
349 They will be rotated regardless of whether NSSM would otherwise have appended\r
350 or replaced them.\r
351 \r
352 NSSM can also rotate files which hit the configured size threshold while the\r
353 service is running.  Additionally, you can trigger an on-demand rotation by\r
354 running the command\r
355 \r
356     nssm rotate <servicename>\r
357 \r
358 On-demand rotations will happen after the next line of data is read from\r
359 the managed application, regardless of the value of AppRotateBytes. Be aware\r
360 that if the application is not particularly verbose the rotation may not\r
361 happen for some time.\r
362 \r
363 To enable online and on-demand rotation, set AppRotateOnline to a non-zero\r
364 value.\r
365 \r
366 Note that online rotation requires NSSM to intercept the application's I/O\r
367 and create the output files on its behalf.  This is more complex and\r
368 error-prone than simply redirecting the I/O streams before launching the\r
369 application.  Therefore online rotation is not enabled by default.\r
370 \r
371 \r
372 Environment variables\r
373 ---------------------\r
374 NSSM can replace or append to the managed application's environment.  Two\r
375 multi-valued string (REG_MULTI_SZ) registry values are recognised under\r
376 HKLM\SYSTEM\CurrentControlSet\Services\<service>\Parameters.\r
377 \r
378 AppEnvironment defines a list of environment variables which will override\r
379 the service's environment.  AppEnvironmentExtra defines a list of\r
380 environment variables which will be added to the service's environment.\r
381 \r
382 Each entry in the list should be of the form KEY=VALUE.  It is possible to\r
383 omit the VALUE but the = symbol is mandatory.\r
384 \r
385 Environment variables listed in both AppEnvironment and AppEnvironmentExtra\r
386 are subject to normal expansion, so it is possible, for example, to update the\r
387 system path by setting "PATH=C:\bin;%PATH%" in AppEnvironmentExtra.  Variables\r
388 are expanded in the order in which they appear, so if you want to include the\r
389 value of one variable in another variable you should declare the dependency\r
390 first.\r
391 \r
392 Because variables defined in AppEnvironment override the existing\r
393 environment it is not possible to refer to any variables which were previously\r
394 defined.\r
395 \r
396 For example, the following AppEnvironment block:\r
397 \r
398       PATH=C:\Windows\System32;C:\Windows\r
399       PATH=C:\bin;%PATH%\r
400 \r
401 Would result in a PATH of "C:\bin;C:\Windows\System32;C:\Windows" as expected.\r
402 \r
403 Whereas the following AppEnvironment block:\r
404 \r
405       PATH=C:\bin;%PATH%\r
406 \r
407 Would result in a path containing only C:\bin and probably cause the\r
408 application to fail to start.\r
409 \r
410 Most people will want to use AppEnvironmentExtra exclusively.  srvany only\r
411 supports AppEnvironment.\r
412 \r
413 As of version 2.25, NSSM parses AppEnvironment and AppEnvironmentExtra\r
414 itself, before reading any other registry values.  As a result it is now\r
415 possible to refer to custom environment variables in Application,\r
416 AppDirectory and other parameters.\r
417 \r
418 \r
419 Merged service environment\r
420 --------------------------\r
421 All Windows services can be passed additional environment variables by\r
422 creating a multi-valued string (REG_MULTI_SZ) registry value named\r
423 HLKM\SYSTEM\CurrentControlSet\Services\<service>\Environment.\r
424 \r
425 The contents of this environment block will be merged into the system\r
426 environment before the service starts.\r
427 \r
428 Note, however, that the merged environment will be sorted alphabetically\r
429 before being processed.  This means that in practice you cannot set,\r
430 for example, DIR=%PROGRAMFILES% in the Environment block because the\r
431 environment passed to the service will not have defined %PROGRAMFILES%\r
432 by the time it comes to define %DIR%.  Environment variables defined in\r
433 AppEnvironmentExtra do not suffer from this limitation.\r
434 \r
435 As of version 2.25, NSSM can get and set the Environment block using\r
436 commands similar to:\r
437 \r
438     nssm get <servicename> Environment\r
439 \r
440 It is worth reiterating that the Environment block is available to all\r
441 Windows services, not just NSSM services.\r
442 \r
443 \r
444 Service startup environment\r
445 ---------------------------\r
446 The environment NSSM passes to the application depends on how various\r
447 registry values are configured.  The following flow describes how the\r
448 environment is modified.\r
449 \r
450 By default:\r
451     The service inherits the system environment.\r
452 \r
453 If <service>\Environment is defined:\r
454     The contents of Environment are MERGED into the environment.\r
455 \r
456 If <service>\Parameters\AppEnvironment is defined:\r
457     The service inherits the environment specified in AppEnvironment.\r
458 \r
459 If <service>\Parameters\AppEnvironmentExtra is defined:\r
460     The contents of AppEnvironmentExtra are APPENDED to the environment.\r
461 \r
462 Note that AppEnvironment overrides the system environment and the\r
463 merged Environment block.  Note also that AppEnvironmentExtra is\r
464 guaranteed to be appended to the startup environment if it is defined.\r
465 \r
466 \r
467 Event hooks\r
468 -----------\r
469 NSSM can run user-configurable commands in response to application events.\r
470 These commands are referred to as "hooks" below.\r
471 \r
472 All hooks are optional.  Any hooks which are run will be launched with the\r
473 environment configured for the service.  NSSM will place additional\r
474 variables into the environment which hooks can query to learn how and why\r
475 they were called.\r
476 \r
477 Hooks are categorised by Event and Action.  Some hooks are run synchronously\r
478 and some are run asynchronously.  Hooks prefixed with an *asterisk are run\r
479 synchronously.  NSSM will wait for these hooks to complete before continuing\r
480 its work.  Note, however, that ALL hooks are subject to a deadline after which\r
481 they will be killed, regardless of whether they are run asynchronously\r
482 or not.\r
483 \r
484   Event: Start - Triggered when the service is requested to start.\r
485    *Action: Pre - Called before NSSM attempts to launch the application.\r
486     Action: Post - Called after the application successfully starts.\r
487 \r
488   Event: Stop - Triggered when the service is requested to stop.\r
489    *Action: Pre - Called before NSSM attempts to kill the application.\r
490 \r
491   Event: Exit - Triggered when the application exits.\r
492    *Action: Post - Called after NSSM has cleaned up the application.\r
493 \r
494   Event: Rotate - Triggered when online log rotation is requested.\r
495    *Action: Pre - Called before NSSM rotates logs.\r
496     Action: Post - Called after NSSM rotates logs.\r
497 \r
498   Event: Power\r
499     Action: Change - Called when the system power status has changed.\r
500     Action: Resume - Called when the system has resumed from standby.\r
501 \r
502 Note that there is no Stop/Post hook.  This is because Exit/Post is called\r
503 when the application exits, regardless of whether it did so in response to\r
504 a service shutdown request.  Stop/Pre is only called before a graceful\r
505 shutdown attempt.\r
506 \r
507 NSSM sets the environment variable NSSM_HOOK_VERSION to a positive number.\r
508 Hooks can check the value of the number to determine which other environment\r
509 variables are available to them.\r
510 \r
511 If NSSM_HOOK_VERSION is 1 or greater, these variables are provided:\r
512 \r
513   NSSM_EXE - Path to NSSM itself.\r
514   NSSM_CONFIGURATION - Build information for the NSSM executable,\r
515     eg 64-bit debug.\r
516   NSSM_VERSION - Version of the NSSM executable.\r
517   NSSM_BUILD_DATE - Build date of NSSM.\r
518   NSSM_PID - Process ID of the running NSSM executable.\r
519   NSSM_DEADLINE - Deadline number of milliseconds after which NSSM will\r
520     kill the hook if it is still running.\r
521   NSSM_SERVICE_NAME - Name of the service controlled by NSSM.\r
522   NSSM_SERVICE_DISPLAYNAME - Display name of the service.\r
523   NSSM_COMMAND_LINE - Command line used to launch the application.\r
524   NSSM_APPLICATION_PID - Process ID of the primary application process.\r
525     May be blank if the process is not running.\r
526   NSSM_EVENT - Event class triggering the hook.\r
527   NSSM_ACTION - Event action triggering the hook.\r
528   NSSM_TRIGGER - Service control triggering the hook.  May be blank if\r
529     the hook was not triggered by a service control, eg Exit/Post.\r
530   NSSM_LAST_CONTROL - Last service control handled by NSSM.\r
531   NSSM_START_REQUESTED_COUNT - Number of times the application was\r
532     requested to start.\r
533   NSSM_START_COUNT - Number of times the application successfully started.\r
534   NSSM_THROTTLE_COUNT - Number of times the application ran for less than\r
535     the throttle period.  Reset to zero on successful start or when the\r
536     service is explicitly unpaused.\r
537   NSSM_EXIT_COUNT - Number of times the application exited.\r
538   NSSM_EXITCODE - Exit code of the application.  May be blank if the\r
539     application is still running or has not started yet.\r
540   NSSM_RUNTIME - Number of milliseconds for which the NSSM executable has\r
541     been running.\r
542   NSSM_APPLICATION_RUNTIME - Number of milliseconds for which the\r
543     application has been running since it was last started.  May be blank\r
544     if the application has not been started yet.\r
545 \r
546 Future versions of NSSM may provide more environment variables, in which\r
547 case NSSM_HOOK_VERSION will be set to a higher number.\r
548 \r
549 Hooks are configured by creating string (REG_EXPAND_SZ) values in the\r
550 registry named after the hook action and placed under\r
551 HKLM\SYSTEM\CurrentControlSet\Services\<service>\Parameters\AppEvents\<event>.\r
552 \r
553 For example the service could be configured to restart when the system\r
554 resumes from standby by setting AppEvents\Power\Resume to:\r
555 \r
556     %NSSM_EXE% restart %NSSM_SERVICE_NAME%\r
557 \r
558 Note that NSSM will abort the startup of the application if a Start/Pre hook\r
559 returns exit code of 99.\r
560 \r
561 A service will normally run hooks in the following order:\r
562 \r
563   Start/Pre\r
564   Start/Post\r
565   Stop/Pre\r
566   Exit/Post\r
567 \r
568 If the application crashes and is restarted by NSSM, the order might be:\r
569 \r
570   Start/Pre\r
571   Start/Post\r
572   Exit/Post\r
573   Start/Pre\r
574   Start/Post\r
575   Stop/Pre\r
576   Exit/Post\r
577 \r
578 \r
579 If NSSM is redirecting stdout or stderr it can be configured to redirect\r
580 the output of any hooks it runs.  Set AppRedirectHooks to 1 to enable\r
581 that functionality.  A hook can of course redirect its own I/O independently\r
582 of NSSM.\r
583 \r
584 \r
585 Managing services using the GUI\r
586 -------------------------------\r
587 NSSM can edit the settings of existing services with the same GUI that is\r
588 used to install them.  Run\r
589 \r
590     nssm edit <servicename>\r
591 \r
592 to bring up the GUI.\r
593 \r
594 NSSM offers limited editing capabilities for services other than those which\r
595 run NSSM itself.  When NSSM is asked to edit a service which does not have\r
596 the App* registry settings described above, the GUI will allow editing only\r
597 system settings such as the service display name and description.\r
598 \r
599 \r
600 Managing services using the command line\r
601 ----------------------------------------\r
602 NSSM can retrieve or set individual service parameters from the command line.\r
603 In general the syntax is as follows, though see below for exceptions.\r
604 \r
605     nssm get <servicename> <parameter>\r
606 \r
607     nssm set <servicename> <parameter> <value>\r
608 \r
609 Parameters can also be reset to their default values.\r
610 \r
611     nssm reset <servicename> <parameter>\r
612 \r
613 The parameter names recognised by NSSM are the same as the registry entry\r
614 names described above, eg AppDirectory.\r
615 \r
616 NSSM offers limited editing capabilities for Services other than those which\r
617 run NSSM itself.  The parameters recognised are as follows:\r
618 \r
619   Description: Service description.\r
620   DisplayName: Service display name.\r
621   Environment: Service merged environment.\r
622   ImagePath: Path to the service executable.\r
623   ObjectName: User account which runs the service.\r
624   Name: Service key name.\r
625   Start: Service startup type.\r
626   Type: Service type.\r
627 \r
628 These correspond to the registry values under the service's key\r
629 HKLM\SYSTEM\CurrentControlSet\Services\<service>.\r
630 \r
631 \r
632 Note that NSSM will concatenate all arguments passed on the command line\r
633 with spaces to form the value to set.  Thus the following two invocations\r
634 would have the same effect.\r
635 \r
636     nssm set <servicename> Description "NSSM managed service"\r
637 \r
638     nssm set <servicename> Description NSSM managed service\r
639 \r
640 \r
641 Non-standard parameters\r
642 -----------------------\r
643 The AppEnvironment, AppEnvironmentExtra and Environment parameters\r
644 recognise an additional argument when querying the environment.  The\r
645 following syntax will print all extra environment variables configured\r
646 for a service\r
647 \r
648     nssm get <servicename> AppEnvironmentExtra\r
649 \r
650 whereas the syntax below will print only the value of the CLASSPATH\r
651 variable if it is configured in the environment block, or the empty string\r
652 if it is not configured.\r
653 \r
654     nssm get <servicename> AppEnvironmentExtra CLASSPATH\r
655 \r
656 When setting an environment block, each variable should be specified as a\r
657 KEY=VALUE pair in separate command line arguments.  For example:\r
658 \r
659     nssm set <servicename> AppEnvironment CLASSPATH=C:\Classes TEMP=C:\Temp\r
660 \r
661 Alternatively the KEY can be prefixed with a + or - symbol to respectively\r
662 add or remove a pair from the block.\r
663 \r
664 The following two lines set CLASSPATH and TEMP:\r
665 \r
666     nssm set <servicename> AppEnvironment CLASSPATH=C:\Classes\r
667     nssm set <servicename> AppEnvironment +TEMP=C:\Temp\r
668 \r
669 If the key is already present, specifying +KEY will override the value\r
670 while preserving the order of keys:\r
671 \r
672     nssm set <servicename> AppEnvironment +CLASSPATH=C:\NewClasses\r
673 \r
674 The following syntax removes a single variable from the block while\r
675 leaving any other variables in place.\r
676 \r
677     nssm set <servicename> AppEnvironment -TEMP\r
678 \r
679 Specifying -KEY=VALUE will remove the variable only if the existing\r
680 value matches.\r
681 \r
682 The following syntax would not remove TEMP=C:\Temp\r
683 \r
684     nssm set <servicename> AppEnvironment -TEMP=C:\Work\Temporary\r
685 \r
686 The + and - symbols are valid characters in environment variables.\r
687 The syntax :KEY=VALUE is equivalent to KEY=VALUE and can be used to\r
688 set variables which start with +/- or to explicitly reset the block in\r
689 a script:\r
690 \r
691     nssm set <servicename> AppEnvironment :CLASSPATH=C:\Classes\r
692     nssm set <servicename> AppEnvironment +TEMP=C:\Temp\r
693 \r
694 \r
695 The AppExit parameter requires an additional argument specifying the exit\r
696 code to get or set.  The default action can be specified with the string\r
697 Default.\r
698 \r
699 For example, to get the default exit action for a service you should run\r
700 \r
701     nssm get <servicename> AppExit Default\r
702 \r
703 To get the exit action when the application exits with exit code 2, run\r
704 \r
705     nssm get <servicename> AppExit 2\r
706 \r
707 Note that if no explicit action is configured for a specified exit code,\r
708 NSSM will print the default exit action.\r
709 \r
710 To set configure the service to stop when the application exits with an\r
711 exit code of 2, run\r
712 \r
713     nssm set <servicename> AppExit 2 Exit\r
714 \r
715 \r
716 The AppPriority parameter is used to set the priority class of the\r
717 managed application.  Valid priorities are as follows:\r
718 \r
719   REALTIME_PRIORITY_CLASS\r
720   HIGH_PRIORITY_CLASS\r
721   ABOVE_NORMAL_PRIORITY_CLASS\r
722   NORMAL_PRIORITY_CLASS\r
723   BELOW_NORMAL_PRIORITY_CLASS\r
724   IDLE_PRIORITY_CLASS\r
725 \r
726 \r
727 The DependOnGroup and DependOnService parameters are used to query or set\r
728 the dependencies for the service.  When setting dependencies, each service\r
729 or service group (preceded with the + symbol) should be specified in\r
730 separate command line arguments.  For example:\r
731 \r
732     nssm set <servicename> DependOnService RpcSs LanmanWorkstation\r
733 \r
734 Alternatively the dependency name can be prefixed with a + or - symbol to\r
735 respectively add or remove a dependency.\r
736 \r
737 The following two lines set dependencies on RpcSs and LanmanWorkstation:\r
738 \r
739     nssm set <servicename> DependOnService RpcSs\r
740     nssm set <servicename> DependOnService +LanmanWorkstation\r
741 \r
742 The follwing syntax removes the dependency on RpcSs:\r
743 \r
744     nssm set <servicename> DependOnService -RpcSs\r
745 \r
746 Service groups should, strictly speaking, be prefixed with the + symbol.\r
747 To specify a single dependency on a group, the + symbol can be prefixed\r
748 with the : symbol.\r
749 \r
750 The following lines are equivalent, and each set a dependency ONLY on\r
751 NetBIOSGroup:\r
752 \r
753     nssm set <servicename> DependOnGroup NetBIOSGroup\r
754     nssm set <servicename> DependOnGroup :NetBIOSGroup\r
755     nssm set <servicename> DependOnGroup :+NetBIOSGroup\r
756 \r
757 Whereas these lines add to any existing dependencies:\r
758 \r
759     nssm set <servicename> DependOnGroup +NetBIOSGroup\r
760     nssm set <servicename> DependOnGroup ++NetBIOSGroup\r
761 \r
762 \r
763 The Name parameter can only be queried, not set.  It returns the service's\r
764 registry key name.  This may be useful to know if you take advantage of\r
765 the fact that you can substitute the service's display name anywhere where\r
766 the syntax calls for <servicename>.\r
767 \r
768 \r
769 The ObjectName parameter requires an additional argument only when setting\r
770 a username.  The additional argument is the password of the user.\r
771 \r
772 To retrieve the username, run\r
773 \r
774     nssm get <servicename> ObjectName\r
775 \r
776 To set the username and password, run\r
777 \r
778     nssm set <servicename> ObjectName <username> <password>\r
779 \r
780 Note that the rules of argument concatenation still apply.  The following\r
781 invocation is valid and will have the expected effect.\r
782 \r
783     nssm set <servicename> ObjectName <username> correct horse battery staple\r
784 \r
785 The following well-known usernames do not need a password.  The password\r
786 parameter can be omitted when using them:\r
787 \r
788   "LocalSystem" aka "System" aka "NT Authority\System"\r
789   "LocalService" aka "Local Service" aka "NT Authority\Local Service"\r
790   "NetworkService" aka "Network Service" aka "NT Authority\Network Service"\r
791 \r
792 \r
793 The Start parameter is used to query or set the startup type of the service.\r
794 Valid service startup types are as follows:\r
795 \r
796   SERVICE_AUTO_START: Automatic startup at boot.\r
797   SERVICE_DELAYED_START: Delayed startup at boot.\r
798   SERVICE_DEMAND_START: Manual service startup.\r
799   SERVICE_DISABLED: The service is disabled.\r
800 \r
801 Note that SERVICE_DELAYED_START is not supported on versions of Windows prior\r
802 to Vista.  NSSM will set the service to automatic startup if delayed start is\r
803 unavailable.\r
804 \r
805 \r
806 The Type parameter is used to query or set the service type.  NSSM recognises\r
807 all currently documented service types but will only allow setting one of two\r
808 types:\r
809 \r
810   SERVICE_WIN32_OWN_PROCESS: A standalone service.  This is the default.\r
811   SERVICE_INTERACTIVE_PROCESS: A service which can interact with the desktop.\r
812 \r
813 Note that a service may only be configured as interactive if it runs under\r
814 the LocalSystem account.  The safe way to configure an interactive service\r
815 is in two stages as follows.\r
816 \r
817     nssm reset <servicename> ObjectName\r
818     nssm set <servicename> Type SERVICE_INTERACTIVE_PROCESS\r
819 \r
820 \r
821 Controlling services using the command line\r
822 -------------------------------------------\r
823 NSSM offers rudimentary service control features.\r
824 \r
825     nssm start <servicename>\r
826 \r
827     nssm restart <servicename>\r
828 \r
829     nssm stop <servicename>\r
830 \r
831     nssm status <servicename>\r
832 \r
833 \r
834 Removing services using the GUI\r
835 -------------------------------\r
836 NSSM can also remove services.  Run\r
837 \r
838     nssm remove <servicename>\r
839 \r
840 to remove a service.  You will prompted for confirmation before the service \r
841 is removed.  Try not to remove essential system services...\r
842 \r
843 \r
844 Removing service using the command line\r
845 ---------------------------------------\r
846 To remove a service without confirmation from the GUI, run\r
847 \r
848     nssm remove <servicename> confirm\r
849 \r
850 Try not to remove essential system services...\r
851 \r
852 \r
853 Logging\r
854 -------\r
855 NSSM logs to the Windows event log.  It registers itself as an event log source\r
856 and uses unique event IDs for each type of message it logs.  New versions may\r
857 add event types but existing event IDs will never be changed.\r
858 \r
859 Because of the way NSSM registers itself you should be aware that you may not\r
860 be able to replace the NSSM binary if you have the event viewer open and that\r
861 running multiple instances of NSSM from different locations may be confusing if\r
862 they are not all the same version.\r
863 \r
864 \r
865 Listing managed services\r
866 ------------------------\r
867 The following command will print the names of all services managed by NSSM:\r
868 \r
869     nssm list\r
870 \r
871 \r
872 Exporting service configuration\r
873 -------------------------------\r
874 NSSM can dump commands which would recreate the configuration of a service.\r
875 The output can be pasted into a batch script to back up the service or\r
876 transfer to another computer.\r
877 \r
878     nssm dump <servicename>\r
879 \r
880 Because the service configuration may contain characters which need to be\r
881 quoted or escaped from the command prompt, NSSM tries hard to produce\r
882 output which will work correctly when run as a script, by adding quotes\r
883 and caret escapes as appropriate.\r
884 \r
885 \r
886 Example usage\r
887 -------------\r
888 To install an Unreal Tournament server:\r
889 \r
890     nssm install UT2004 c:\games\ut2004\system\ucc.exe server\r
891 \r
892 To run the server as the "games" user:\r
893 \r
894     nssm set UT2004 ObjectName games password\r
895 \r
896 To configure the server to log to a file:\r
897 \r
898     nssm set UT2004 AppStdout c:\games\ut2004\service.log\r
899 \r
900 To restrict the server to a single CPU:\r
901 \r
902     nssm set UT2004 AppAffinity 0\r
903 \r
904 To remove the server:\r
905 \r
906     nssm remove UT2004 confirm\r
907 \r
908 To find out the service name of a service with a display name:\r
909 \r
910     nssm get "Background Intelligent Transfer Service" Name\r
911 \r
912 \r
913 Building NSSM from source\r
914 -------------------------\r
915 NSSM is known to compile with Visual Studio 2008 and later.  Older Visual\r
916 Studio releases may or may not work if you install an appropriate SDK and\r
917 edit the nssm.vcproj and nssm.sln files to set a lower version number.\r
918 They are known not to work with default settings.\r
919 \r
920 NSSM will also compile with Visual Studio 2010 but the resulting executable\r
921 will not run on versions of Windows older than XP SP2.  If you require\r
922 compatiblity with older Windows releases you should change the Platform\r
923 Toolset to v90 in the General section of the project's Configuration\r
924 Properties.\r
925 \r
926 \r
927 Credits\r
928 -------\r
929 Thanks to Bernard Loh for finding a bug with service recovery.\r
930 Thanks to Benjamin Mayrargue (www.softlion.com) for adding 64-bit support.\r
931 Thanks to Joel Reingold for spotting a command line truncation bug.\r
932 Thanks to Arve Knudsen for spotting that child processes of the monitored\r
933 application could be left running on service shutdown, and that a missing\r
934 registry value for AppDirectory confused NSSM.\r
935 Thanks to Peter Wagemans and Laszlo Keresztfalvi for suggesting throttling\r
936 restarts.\r
937 Thanks to Eugene Lifshitz for finding an edge case in CreateProcess() and for\r
938 advising how to build messages.mc correctly in paths containing spaces.\r
939 Thanks to Rob Sharp for pointing out that NSSM did not respect the\r
940 AppEnvironment registry value used by srvany.\r
941 Thanks to Szymon Nowak for help with Windows 2000 compatibility.\r
942 Thanks to François-Régis Tardy and Gildas le Nadan for French translation.\r
943 Thanks to Emilio Frini for spotting that French was inadvertently set as\r
944 the default language when the user's display language was not translated.\r
945 Thanks to Riccardo Gusmeroli and Marco Certelli for Italian translation.\r
946 Thanks to Eric Cheldelin for the inspiration to generate a Control-C event\r
947 on shutdown.\r
948 Thanks to Brian Baxter for suggesting how to escape quotes from the command\r
949 prompt.\r
950 Thanks to Russ Holmann for suggesting that the shutdown timeout be configurable.\r
951 Thanks to Paul Spause for spotting a bug with default registry entries.\r
952 Thanks to BUGHUNTER for spotting more GUI bugs.\r
953 Thanks to Doug Watson for suggesting file rotation.\r
954 Thanks to Арслан Сайдуганов for suggesting setting process priority.\r
955 Thanks to Robert Middleton for suggestion and draft implementation of process\r
956 affinity support.\r
957 Thanks to Andrew RedzMax for suggesting an unconditional restart delay.\r
958 Thanks to Bryan Senseman for noticing that applications with redirected stdout\r
959 and/or stderr which attempt to read from stdin would fail.\r
960 Thanks to Czenda Czendov for help with Visual Studio 2013 and Server 2012R2.\r
961 Thanks to Alessandro Gherardi for reporting and draft fix of the bug whereby\r
962 the second restart of the application would have a corrupted environment.\r
963 Thanks to Hadrien Kohl for suggesting to disable the console window's menu.\r
964 Thanks to Allen Vailliencourt for noticing bugs with configuring the service to\r
965 run under a local user account.\r
966 Thanks to Sam Townsend for noticing a regression with TerminateProcess().\r
967 Thanks to Barrett Lewis for suggesting the option to skip terminating the\r
968 application's child processes.\r
969 Thanks to Miguel Angel Terrón for suggesting copy/truncate rotation.\r
970 Thanks to Yuriy Lesiuk for suggesting setting the environment before querying\r
971 the registry for parameters.\r
972 Thanks to Gerald Haider for noticing that installing a service with NSSM in a\r
973 path containing spaces was technically a security vulnerability.\r
974 Thanks to Scott Ware for reporting a crash saving the environment on XP 32-bit.\r
975 Thanks to Stefan and Michael Scherer for reporting a bug writing the event messages source.\r
976 Thanks to Paul Baxter for help with Visual Studio 2015.\r
977 Thanks to Mathias Breiner for help with Visual Studio and some registry fixes.\r
978 Thanks to David Bremner for general tidyups.\r
979 Thanks to Nabil Redmann for suggesting redirecting hooks' output.\r
980 \r
981 Licence\r
982 -------\r
983 NSSM is public domain.  You may unconditionally use it and/or its source code \r
984 for any purpose you wish.\r