O botão Stop envia um controle "Stop service" para o programa principal do serviço - neste caso, é srvany . O resto depende desse programa. E parece que srvany simplesmente ignorará o controle .
Parece que a versão do srvany para o Windows NT 4.0 faz matar seus filhos imediatos - você pode obtê-lo da Microsoft .
É possível escrever um serviço do Windows real que pare muito bem seu programa Ruby - por exemplo, usando win32serviceutil do Python. (Não parece haver nenhum módulo Ruby para fazer interface com o Windows, infelizmente.)
Da linha de comando ou scripts em lote, isso fará o mesmo que o botão Parar:
-
sc stop <name> -
net stop <name>
Programaticamente, você precisa ligar para OpenSCManager(...) , OpenService(...) , então ControlService(..., SERVICE_CONTROL_STOP) .