I have a windows service that I need to stop and start every 30 minutes using a Windows Scheduled Task.
The service itself can be manually stopped via the Services management console (right-click -> Stop, right-click -> Start).
The following batch file, when run by double-clicking on the file, or through the command line, works almost instantly, and successfully stops and starts the service:
net stop "Service Name" net start "Service Name"
However, when I create a scheduled task to run this batch file every 30 minutes, I get problems.
When I run the scheduled task (right-click -> Run), the service seems to get stuck in "Stopping" state for about 2 minutes and then remains stopped. The scheduled task seems to report no errors and just sits there waiting for the next 30 minutes.
This is on Windows Server 2008 R2 and the following scheduled task options:
- Start daily at 08:00:00
- Repeat every 30 minutes indefinitely
- If task is already on, don't start another one
- Allow task to run on demand
- If task fails, restart every 30 minutes
- Run as NT AUTHORITY\SYSTEM
- Run even when the user is not logged in
- Run with the highest privileges
- Configure for Windows 7, Windows Server 2008 R2
I'm at a loss, is this a known issue? Am I doing something wrong? The only other question that seems similar here is this one: Is there a problem with Windows 7 64-bit stopping service?, but I don't know if my problem is related, and I can reproduce this every time (it never seems to work as a scheduled task, but works fine if I just run the batch file myself)
If you can think of a better question title, please feel free to change!
Not really related to the question, but in case you're interested, the reason I'm doing this is as a temporary work-around for a network-related issue whereby the service (which communicates via a socket connection with another service on a remote machine) is having its port closed due to inactivity every so often. As the network infrastructure can't be changed, the service itself will eventually be updated to ensure it keeps in more regular contact with the remote service.
UPDATE FOLLOWING SUGGESTIONS
OK, so for whatever reason, the service was taking too long to stop when my little batch file was run as a scheduled task, so I wrote the following batch file, which waits for it to stop (thanks to @CoreTech for the SC.exe hint)
net stop "service name" REM Wait for the service to stop (could take a minute or two...) :loop_start sc query "service name" | FIND "STATE" | FIND "STOPPED" if errorlevel 1 goto :timeout_wait REM Start the service again... net start "service name" goto :end :timeout_wait timeout 30 goto :loop_start :end
This works fine, but I still have no idea why the behaviour is different from just stopping the service manually and setting up the scheduled task :(
Following several hours of introducing my head to a nearby brick wall*, it suddenly dawned on me that there's a third spoke in this ring of infamous Windows Service death...
Two services are involved (I hadn't mentioned this before, because I didn't think it was relevant). It turns out that, because of a misconfiguration, or possibly sabotage, both services are trying to connect over the network on the same port number... The conflict was causing the problems which lead to the need to restart the services in the first place AND was contributing to the odd behaviour when restarting the services. Once I disabled one service and was working with just one service, everything started to work exactly as expected... Moral of the story: Don't just look for the solution, understand the problem and the solution will present itself to you!
I just made that moral up, it's a work in progress...
* Me: "Head, brick wall; brick wall, head."
Head: goes in for a handshake, realises it doesn't have any hands... bang...
Brick wall: does nothing... it's a brick wall