There are a number of things that lead to a stalled/non-working Timer service but an easy way to notice it isn’t working is SharePoint “Alerts” don’t get processed.
An ‘Alert’ is notification that something has changed within a document library, list item, documents, lists, surveys or search results.

So what drives me nuts is when you’re trying to troubleshoot an issue in SharePoint and you go to restart the “Timer” service. Except after a little bit you get this really helpful error.
So now the service is stuck at a “Stopping” stage and pretty much you can’t do much about it except go to your task manager and ‘Kill’ it. Of course that seems to do the job 90% of the time except those times when it doesn’t. So the core issue is when MOSS 2007 goes to initialize the Timer service it returns an error that it did not succeed in initializing it. So in short MOSS is waiting on the Timer service to return it has been ‘started’ and the Timer service is waiting on MOSS to say ‘start’. It’s like an endless loop of “I thought you were going to let me know”.
Again the easiest way is to just Kill the service and try again.
There is a way to change the behavior but it comes with a risk. Normally services are set to “Restart” in the event of a failure but that lies the problem. Before the service can end, it sends a notice to the application that it is stopping. It tries to restart but the service is looking for a start initializing command from the application but since it didn’t actually communicate back to the application it doesn’t actually stop. Hence the loop. By changing the service to “Take No Action” at First Failure and each subsequent failure allows the service to actually stop. However therein lies the risk, in this setup the service will just stop. Of course like any good SharePoint Admin you should have some sort of notification system (SCOM, Nagios, etc…) to alert you that the service has
stopped right?
It is my belief that the best solution is to set the service to restart itself and then Kill the service manually when it doesn’t restart. Of course I’ll update this post if I find a better solution..