You asked for "any ideas" so here is some anecdotal evidence: This symptom (becoming non-responsive but refusing to completely stop) may not have anything to do with the engine being run as a service, since I have seen it happen to foreground servers. Here is the pseudocode for a "suicide", er, "shutdown" stored procedure that helped:
for each remote server EXECUTE IMMEDIATE 'ALTER SERVER ... CONNECTION CLOSE ALL'; for each NEXT_CONNECTION value other than this one EXECUTE IMMEDIATE 'DROP CONNECTION ...'; WAITFOR DELAY '00:00:01'; EXECUTE IMMEDIATE 'STOP ENGINE UNCONDITIONALLY';
In the past I have also launched a kill command from within a stored procedure,when the zombie server symptom was severe. No matter how you stop a server, it should be able to recover the data automatically when it restarts... after all, recovery works after a power failure.
CALL xp_cmdshell ( STRING ( 'taskkill /FI "WINDOWTITLE eq ', PROPERTY ( 'Name' ), ' - *" /T /F' ), 'no_output' );