5

Ho una manciata di app console installate come servizi in esecuzione in topshelf e se installo ed eseguo manualmente funzionano perfettamente. Tuttavia, nessuno si avvia automaticamente anche se il tipo di avvio è impostato su Automatico.I servizi automatici non si avviano

Le applicazioni sono configurati come segue:

HostFactory.Run(x => 
{ 
    x.Service<MyApp>(s => 
    { 
     s.ConstructUsing(name => container.Resolve<MyApp>()); 
     s.WhenStarted(tc => tc.Start()); 
     s.WhenStopped(tc => 
     { 
      tc.Stop(); 
      container.Dispose(); 
     }); 
    }); 

    x.RunAsLocalSystem(); 
    x.StartAutomatically(); 
    x.EnableServiceRecovery(rc => rc.RestartService(5)); 
}); 

Le applicazioni eseguite sotto Win 2008 R2 e vengono installati utilizzando un file batch eseguito come Admin. Il file batch include quanto segue:

app.exe install --sudo 
app.exe start 

Dopo l'esecuzione del file batch, i servizi vengono eseguiti come previsto. Tuttavia se riavvio rimangono fermi.

Il registro eventi restituisce lo stesso paio di eventi per ogni servizio:

Event 7000: The service failed to start due to the following error: The service did not respond to the start or control request in a timely fashion.

Event 7009: A timeout was reached (30000 milliseconds) while waiting for the service to connect.

L'unico modo per avviare l'applicazione dopo un riavvio è quello di eseguire app.exe start da un prompt dei comandi con privilegi elevati.

Qualche idea?

risposta

4

OK ho risolto. I tipi di avvio del servizio erano impostati su Automatico, ma li ho cambiati in Automatico (Ritardato) e ora funzionano correttamente all'avvio.

Inoltre ho modificato l'installazione file batch per un utilizzo futuro:

app.exe install --delayed --sudo 
app.exe start 

Solo una supposizione, ma probabilmente dipende da servizi di rete che potrebbero non essere disponibili.

+0

Mi hai appena salvato 100 anni di scavare nella spazzatura di informazioni :) – alerya

2

La risposta più probabile è che ci vuole troppo tempo perché il contenitore venga creato e risolto durante l'avvio quando si verificano altri elementi sulla macchina. Quando lo fai manualmente, nient'altro è in competizione per le risorse. Puoi rinviare parte del lavoro svolto nel tuo contenitore fino a dopo la creazione &? Puoi anche richiedere più tempo, ma non ricordo quell'API fuori dalla mia testa.

+0

Un buon punto, il carico della CPU potrebbe essere elevato poiché ogni app esegue un'elaborazione della coda su Amazon SQS. All'avvio il servizio controlla la coda, scarica alcuni oggetti da S3, li elabora, carica nuovamente su S3 e scrive un nuovo messaggio in coda. Anche se abbiamo a che fare con poche decine di messaggi all'ora, sono molto leggeri sulle risorse della CPU. Ma la macchina è un'istanza micro EC2 e probabilmente il picco potrebbe far fallire tutti e 6 i servizi ... anche se non sono del tutto convinto che questa sia la causa. Cercherò di disabilitare tutti tranne uno e vedere se riesco a farlo avviare automaticamente. –

+0

Ancora nessuna gioia. Ho preso un nuovo stock win2012 VM e installato un singolo servizio e testato il suo funzionamento. Dopo un riavvio rimane fermo e il registro eventi mostra l'errore sopra riportato. Se avvio manualmente il servizio viene eseguito immediatamente. –

+0

Se è possibile creare una semplice riproduzione e portarla alla mailing list (https://groups.google.com/forum/?fromgroups#!forum/topshelf-discuss) allora forse potremo dare una mano in più. Il sintomo è ancora dello stesso problema, sta richiedendo troppo tempo durante l'avvio. Quindi la risposta è in qualche modo ritardare ciò che sta richiedendo troppo tempo durante l'avvio, ma non più tardi. – Travis