Introduction
This article presents a not-so-known feature of Windows 2000 and above: the ability to automatically restart a Windows Service when it crashes. We use this feature to improve the reliability of many services, including MySQL which (alas) sometimes crashes unexpectedly.
Background
A Windows Service is a specially designed application that can be started automatically at system boot. Windows Services can execute even when no user is logged on to the system. Windows services are usually implemented in C++, but can also be written in any of the .NET languages (C#, VB.NET).
Since Windows 2000, Windows Services support corrective actions - actions that are to be taken in case of a failure (a Service is considered failed when it terminates without reporting a status of SERVICE_STOPPED
to the Service Control Manager).
Whenever a service fails, the Service Control Manager detects it and logs an error in System Event Log:
The XXX service terminated unexpectedly. It has done this YYY time(s).
If the service has an associated corrective action, it logs the following message and executes the corrective action:
The following corrective action will be taken in ZZZ milliseconds: ACTION
Corrective actions can be:
- No action. (
SC_ACTION_NONE
; the default)
- Restart the service. (
SC_ACTION_RESTART
)
- Reboot the system. (
SC_ACTION_REBOOT
)
- Run any command.(
SC_ACTION_RUN_COMMAND
)
This sample application, written in Visual C++ .NET, uses the Win32 function ChangeServiceConfig2
to configure the MySQL Service to automatically restart in case of a failure. It can be called (or integrated) as part of a setup/installation procedure of MySQL on Windows.
Using the application
You can run the application from the command line prompt (CMD.EXE):
C:\> MySQLServiceSetCorrectiveActions.exe
SUCCESS: Configuration for Service "MySQL" changed!
You can use the application to configure another service, e.g. W3SVC (IIS):
C:\> MySQLServiceSetCorrectiveActions.exe W3SVC
SUCCESS: Configuration for Service "W3SVC" changed!
You can use the application to call your own recovery program (even a batch) in case of a failure:
C:\> MySQLServiceSetCorrectiveActions.exe MySQL "CMD.EXE /C C:\mybatch.bat"
SUCCESS: Configuration for Service "MySQL" changed!
And you can also clear the corrective action by passing an empty string as the second parameter:
C:\> MySQLServiceSetCorrectiveActions.exe MySQL ""
SUCCESS: Configuration for Service "MySQL" changed!
Points of interest
There is no such thing as bug-free code - Windows Services are no exception. Since most Services provide vital functionality to an application, they must be up and running 24/7. This lack of auto-restart feature in Services was a severe deficiency in Windows (compared to UNIX where inetd - among others - has been there for ages to automatically start/restart daemon processes). Now it's over - but is not so popular or well-known. Let's make tools integrate the right system calls into all services - why not directly into all installation programs for services?
History