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