-Changes since 2.20
------------------
- * Services installed from the GUI no longer have incorrect
- AppParameters set in the registry.
-
-Changes since 2.19
------------------
- * Services installed from the commandline without using the
- GUI no longer have incorrect AppStopMethod* registry
- entries set.
-
-Changes since 2.18
------------------
- * Support AppEnvironmentExtra to append to the environment
- instead of replacing it.
-
- * The GUI is significantly less sucky.
-
-Changes since 2.17
------------------
- * Timeouts for each shutdown method can be configured in
- the registry.
-
- * The GUI is slightly less sucky.
-
-Changes since 2.16
------------------
- * NSSM can now redirect the service's I/O streams to any path
- capable of being opened by CreateFile().
-
- * Allow building on Visual Studio Express.
-
- * Silently ignore INTERROGATE control.
-
- * Try to send Control-C events to console applications when
- shutting them down.
-
-Changes since 2.15
------------------
- * Fixed case where NSSM could kill unrelated processes when
- shutting down.
-
-Changes since 2.14
------------------
- * NSSM is now translated into Italian.
-
- * Fixed GUI not allowing paths longer than 256 characters.
-
-Changes since 2.13
------------------
- * Fixed default GUI language being French not English.
-
-Changes since 2.12
------------------
- * Fixed failure to run on Windows 2000.
-
-Changes since 2.11
------------------
- * NSSM is now translated into French.
-
- * Really ensure systems recovery actions can happen.
-
- The change supposedly introduced in v2.4 to allow service recovery
- actions to be activated when the application exits gracefully with
- a non-zero error code didn't actually work.
-
-Changes since 2.10
------------------
- * Support AppEnvironment for compatibility with srvany.
-
-Changes since 2.9
------------------
- * Fixed failure to compile messages.mc in paths containing spaces.
-
- * Fixed edge case with CreateProcess().
-
- Correctly handle the case where the application executable is under
- a path which contains space and an executable sharing the initial
- part of that path (up to a space) exists.
-
-Changes since 2.8
------------------
- * Fixed failure to run on Windows versions prior to Vista.
-
-Changes since 2.7
------------------
- * Read Application, AppDirectory and AppParameters before each restart so
- a change to any one doesn't require restarting NSSM itself.
-
- * Fixed messages not being sent to the event log correctly in some
- cases.
-
- * Try to handle (strictly incorrect) quotes in AppDirectory.
-
- Windows directories aren't allowed to contain quotes so CreateProcess()
- will fail if the AppDirectory is quoted. Note that it succeeds even if
- Application itself is quoted as the application plus parameters are
- interpreted as a command line.
-
- * Fixed failed to write full arguments to AppParameters when
- installing a service.
-
- * Throttle restarts.
-
- Back off from restarting the application immediately if it starts
- successfully but exits too soon. The default value of "too soon" is
- 1500 milliseconds. This can be configured by adding a DWORD value
- AppThrottle to the registry.
-
- Handle resume messages from the service console to restart the
- application immediately even if it is throttled.
-
- * Try to kill the process tree gracefully.
-
- Before calling TerminateProcess() on all processes assocatiated with
- the monitored application, enumerate all windows and threads and
- post appropriate messages to them. If the application bothers to
- listen for such messages it has a chance to shut itself down gracefully.
-
-Changes since 2.6
------------------
- * Handle missing registry values.
-
- Warn if AppParameters is missing. Warn if AppDirectory is missing or
- unset and choose a fallback directory.
- First try to find the parent directory of the application. If that
- fails, eg because the application path is just "notepad" or something,
- start in the Windows directory.
-
- * Kill process tree when stopping service.
-
- Ensure that all child processes of the monitored application are
- killed when the service stops by recursing through all running
- processes and terminating those whose parent is the application
- or one of its descendents.
-
-Changes since 2.5
------------------
- * Removed incorrect ExpandEnvironmentStrings() error.
-
- A log_event() call was inadvertently left in the code causing an error
- to be set to the eventlog saying that ExpandEnvironmentStrings() had
- failed when it had actually succeeded.
-
-Changes since 2.4
------------------
- * Allow use of REG_EXPAND_SZ values in the registry.
-
- * Don't suicide on exit status 0 by default.
-
- Suiciding when the application exits 0 will cause recovery actions to be
- taken. Usually this is inappropriate. Only suicide if there is an
- explicit AppExit value for 0 in the registry.
-
- Technically such behaviour could be abused to do something like run a
- script after successful completion of a service but in most cases a
- suicide is undesirable when no actual failure occurred.
-
- * Don't hang if startup parameters couldn't be determined.
- Instead, signal that the service entered the STOPPED state.
- Set START_PENDING state prior to actual startup.
-
-Changes since 2.3
------------------
- * Ensure systems recovery actions can happen.
-
- In Windows versions earlier than Vista the service manager would only
- consider a service failed (and hence eligible for recovery action) if
- the service exited without setting its state to SERVICE_STOPPED, even if
- it signalled an error exit code.
- In Vista and later the service manager can be configured to treat a
- graceful shutdown with error code as a failure but this is not the
- default behaviour.
-
- Try to configure the service manager to use the new behaviour when
- starting the service so users who set AppExit to Exit can use recovery
- actions as expected.
-
- Also recognise the new AppExit option Suicide for use on pre-Vista
- systems. When AppExit is Suicide don't stop the service but exit
- inelegantly, which should be seen as a failure.
-
-Changes since 2.2
------------------
- * Send properly formatted messages to the event log.
-
- * Fixed truncation of very long path lengths in the registry.
-
-Changes since 2.1
------------------
- * Decide how to handle application exit.
-
- When the service exits with exit code n look in
- HKLM\SYSTEM\CurrentControlSet\Services\<service>\Parameters\AppExit\<n>,
- falling back to the unnamed value if no such code is listed. Parse the
- (string) value of this entry as follows:
-
- Restart: Start the application again (NSSM default).
- Ignore: Do nothing (srvany default).
- Exit: Stop the service.
-
-Changes since 2.0
------------------
- * Added support for building a 64-bit executable.
-
- * Added project files for newer versions of Visual Studio.
+Changes since 2.24\r
+------------------\r
+ * Allow skipping kill_process_tree().\r
+\r
+ * NSSM can now sleep a configurable amount of time after\r
+ rotating output files.\r
+\r
+ * NSSM can now rotate log files by calling CopyFile()\r
+ followed by SetEndOfFile(), allowing it to rotate files\r
+ which other processes hold open.\r
+\r
+ * NSSM now sets the service environment before querying\r
+ parameters from the registry, so paths and arguments\r
+ can reference environment configured in AppEnvironment\r
+ or AppEnvironmentExtra.\r
+\r
+Changes since 2.23\r
+------------------\r
+ * NSSM once again calls TerminateProcess() correctly.\r
+\r
+Changes since 2.22\r
+------------------\r
+ * NSSM no longer clutters the event log with "The specified\r
+ procedure could not be found" on legacy Windows releases.\r
+\r
+ * Fixed failure to set a local username to run the service.\r
+\r
+Changes since 2.21\r
+------------------\r
+ * Existing services can now be managed using the GUI\r
+ or on the command line.\r
+\r
+ * NSSM can now set the priority class and processor\r
+ affinity of the managed application.\r
+\r
+ * NSSM can now apply an unconditional delay before\r
+ restarting the application.\r
+\r
+ * NSSM can now optionally rotate existing files when\r
+ redirecting I/O.\r
+\r
+ * Unqualified path names are now relative to the\r
+ application startup directory when redirecting I/O.\r
+\r
+ * NSSM can now set the service display name, description,\r
+ startup type and log on details.\r
+\r
+ * All services now receive a standard console window,\r
+ allowing them to read input correctly (if running in\r
+ interactive mode).\r
+\r
+Changes since 2.20\r
+------------------\r
+ * Services installed from the GUI no longer have incorrect\r
+ AppParameters set in the registry.\r
+\r
+Changes since 2.19\r
+------------------\r
+ * Services installed from the commandline without using the\r
+ GUI no longer have incorrect AppStopMethod* registry\r
+ entries set.\r
+\r
+Changes since 2.18\r
+------------------\r
+ * Support AppEnvironmentExtra to append to the environment\r
+ instead of replacing it.\r
+\r
+ * The GUI is significantly less sucky.\r
+\r
+Changes since 2.17\r
+------------------\r
+ * Timeouts for each shutdown method can be configured in\r
+ the registry.\r
+\r
+ * The GUI is slightly less sucky.\r
+\r
+Changes since 2.16\r
+------------------\r
+ * NSSM can now redirect the service's I/O streams to any path\r
+ capable of being opened by CreateFile().\r
+\r
+ * Allow building on Visual Studio Express.\r
+\r
+ * Silently ignore INTERROGATE control.\r
+\r
+ * Try to send Control-C events to console applications when\r
+ shutting them down.\r
+\r
+Changes since 2.15\r
+------------------\r
+ * Fixed case where NSSM could kill unrelated processes when\r
+ shutting down.\r
+\r
+Changes since 2.14\r
+------------------\r
+ * NSSM is now translated into Italian.\r
+\r
+ * Fixed GUI not allowing paths longer than 256 characters.\r
+\r
+Changes since 2.13\r
+------------------\r
+ * Fixed default GUI language being French not English.\r
+\r
+Changes since 2.12\r
+------------------\r
+ * Fixed failure to run on Windows 2000.\r
+\r
+Changes since 2.11\r
+------------------\r
+ * NSSM is now translated into French.\r
+\r
+ * Really ensure systems recovery actions can happen.\r
+\r
+ The change supposedly introduced in v2.4 to allow service recovery\r
+ actions to be activated when the application exits gracefully with\r
+ a non-zero error code didn't actually work.\r
+\r
+Changes since 2.10\r
+------------------\r
+ * Support AppEnvironment for compatibility with srvany.\r
+\r
+Changes since 2.9\r
+-----------------\r
+ * Fixed failure to compile messages.mc in paths containing spaces.\r
+\r
+ * Fixed edge case with CreateProcess().\r
+\r
+ Correctly handle the case where the application executable is under\r
+ a path which contains space and an executable sharing the initial\r
+ part of that path (up to a space) exists.\r
+\r
+Changes since 2.8\r
+-----------------\r
+ * Fixed failure to run on Windows versions prior to Vista.\r
+\r
+Changes since 2.7\r
+-----------------\r
+ * Read Application, AppDirectory and AppParameters before each restart so\r
+ a change to any one doesn't require restarting NSSM itself.\r
+\r
+ * Fixed messages not being sent to the event log correctly in some\r
+ cases.\r
+\r
+ * Try to handle (strictly incorrect) quotes in AppDirectory.\r
+\r
+ Windows directories aren't allowed to contain quotes so CreateProcess()\r
+ will fail if the AppDirectory is quoted. Note that it succeeds even if\r
+ Application itself is quoted as the application plus parameters are\r
+ interpreted as a command line.\r
+\r
+ * Fixed failed to write full arguments to AppParameters when\r
+ installing a service.\r
+\r
+ * Throttle restarts.\r
+\r
+ Back off from restarting the application immediately if it starts\r
+ successfully but exits too soon. The default value of "too soon" is\r
+ 1500 milliseconds. This can be configured by adding a DWORD value\r
+ AppThrottle to the registry.\r
+ \r
+ Handle resume messages from the service console to restart the\r
+ application immediately even if it is throttled.\r
+\r
+ * Try to kill the process tree gracefully.\r
+\r
+ Before calling TerminateProcess() on all processes assocatiated with\r
+ the monitored application, enumerate all windows and threads and\r
+ post appropriate messages to them. If the application bothers to\r
+ listen for such messages it has a chance to shut itself down gracefully.\r
+\r
+Changes since 2.6\r
+-----------------\r
+ * Handle missing registry values.\r
+\r
+ Warn if AppParameters is missing. Warn if AppDirectory is missing or\r
+ unset and choose a fallback directory.\r
+ First try to find the parent directory of the application. If that\r
+ fails, eg because the application path is just "notepad" or something,\r
+ start in the Windows directory.\r
+\r
+ * Kill process tree when stopping service.\r
+\r
+ Ensure that all child processes of the monitored application are\r
+ killed when the service stops by recursing through all running\r
+ processes and terminating those whose parent is the application\r
+ or one of its descendents.\r
+\r
+Changes since 2.5\r
+-----------------\r
+ * Removed incorrect ExpandEnvironmentStrings() error.\r
+\r
+ A log_event() call was inadvertently left in the code causing an error\r
+ to be set to the eventlog saying that ExpandEnvironmentStrings() had\r
+ failed when it had actually succeeded.\r
+\r
+Changes since 2.4\r
+-----------------\r
+ * Allow use of REG_EXPAND_SZ values in the registry.\r
+\r
+ * Don't suicide on exit status 0 by default.\r
+\r
+ Suiciding when the application exits 0 will cause recovery actions to be\r
+ taken. Usually this is inappropriate. Only suicide if there is an\r
+ explicit AppExit value for 0 in the registry.\r
+ \r
+ Technically such behaviour could be abused to do something like run a\r
+ script after successful completion of a service but in most cases a\r
+ suicide is undesirable when no actual failure occurred.\r
+\r
+ * Don't hang if startup parameters couldn't be determined.\r
+ Instead, signal that the service entered the STOPPED state.\r
+ Set START_PENDING state prior to actual startup.\r
+\r
+Changes since 2.3\r
+-----------------\r
+ * Ensure systems recovery actions can happen.\r
+\r
+ In Windows versions earlier than Vista the service manager would only\r
+ consider a service failed (and hence eligible for recovery action) if\r
+ the service exited without setting its state to SERVICE_STOPPED, even if\r
+ it signalled an error exit code.\r
+ In Vista and later the service manager can be configured to treat a\r
+ graceful shutdown with error code as a failure but this is not the\r
+ default behaviour.\r
+\r
+ Try to configure the service manager to use the new behaviour when\r
+ starting the service so users who set AppExit to Exit can use recovery\r
+ actions as expected.\r
+\r
+ Also recognise the new AppExit option Suicide for use on pre-Vista\r
+ systems. When AppExit is Suicide don't stop the service but exit\r
+ inelegantly, which should be seen as a failure.\r
+\r
+Changes since 2.2\r
+-----------------\r
+ * Send properly formatted messages to the event log.\r
+\r
+ * Fixed truncation of very long path lengths in the registry.\r
+\r
+Changes since 2.1\r
+-----------------\r
+ * Decide how to handle application exit.\r
+\r
+ When the service exits with exit code n look in\r
+ HKLM\SYSTEM\CurrentControlSet\Services\<service>\Parameters\AppExit\<n>,\r
+ falling back to the unnamed value if no such code is listed. Parse the\r
+ (string) value of this entry as follows:\r
+\r
+ Restart: Start the application again (NSSM default).\r
+ Ignore: Do nothing (srvany default).\r
+ Exit: Stop the service.\r
+\r
+Changes since 2.0\r
+-----------------\r
+ * Added support for building a 64-bit executable.\r
+\r
+ * Added project files for newer versions of Visual Studio.\r