Domanda

Sto cercando di scrivere un demone Mono C # per Linux.

Mi piacerebbe fare un inizio e un arresto di esso quando ha terminato l'elaborazione invece di semplicemente uccidere il processo.

Qualcuno ha qualche esempio di questo?

Modifica: ho capito come usare start-stop-daemon --background in debian, quindi penso che lo userò per ora.

Modifica: lo sto implementando anche in Java e hanno questo bel addShutdownHook che intercetta la chiusura dell'app. Devo dedicare un po 'più di tempo a sistemare le dipendenze per il servizio mono o a trovare un modo per individuare la chiusura dell'app.

Esiste l'evento SessionEnd, ma è disponibile solo per i servizi e non per le app della console

Risposta: usando mono-service per avvolgere un servizio Windows su Linux

È stato utile?

Soluzione

È necessario implementare un servizio e utilizzare mono-servizio. Google per questo e troverai diversi esempi.

Altri suggerimenti

Per ricevere notifiche in modo Unix, che utilizza segnali, si desidera utilizzare Mono.Unix.UnixSignal per ogni segnale che prevedi di ricevere e quindi chiama UnixSignal.WaitAny () su un array di segnali.


In genere lo faresti su un thread separato.

Un metodo semplice sarebbe quello di ascoltare su una porta (locale, alta) e ricevere comandi da un client di gestione, come fa il bind.

Un modo più unix-ish sarebbe quello di registrare un gestore di segnale utilizzando UnixSignal e spegnimento corretto alla ricezione di un determinato segnale. Consulta le Domande frequenti su Mono, " Posso usare i gestori di segnale con Mono? & Quot; per avvertenze e un esempio.

lupus ha trovato mono-service , che è un processo di hosting che utilizza interfacce ServiceProcess . Purtroppo questo richiede l'impostazione MONO_DISABLE_SHM , che disabilita alcune funzionalità in Mono, in particolare i sistemi IPC tra processi.

Un demone sotto Linux in genere ascolta segnali, come il segnale di interruzione, ma ce ne sono altri che gli consentono di fare cose come un riavvio graduale (legge nella configurazione) e così via.

In genere questo è accompagnato da uno script nella directory /etc/init.d che controlla l'avvio e l'arresto di tali demoni. In genere un file pid viene creato in / var / run, che mantiene l'ID del processo per lo script per identificare rapidamente il processo.

Anche durante la codifica per Mono, dovresti capire bene l'ambiente per cui stai codificando, poiché non c'è differenza tra un processo Mono o un processo nativo (creato in C, ad esempio) o uno script.

Dave

Miguel de Icaza ha recentemente scritto di un nuovo Mono Shell interattiva C # che dovresti essere in grado di demonizzare abbastanza facilmente. Miguel ha un articolo di follow-up con un codice sorgente che mostra come puoi includere la shell interattiva in altre applicazioni C #. Può servire come un buon punto di partenza per il tuo demone.

Nota che la shell interattiva richiede la versione 2.2 di Mono, che non è stata ancora rilasciata. Il codice è disponibile in repository svn di Mono , tuttavia.

David ha ragione, l'arresto di un servizio è realizzato tramite un segnale UNIX e dovresti usare un gestore di segnale per catturarlo.

In alternativa, utilizzo uno script di shell. Avvia la mia app mono, quindi quando la mia app si chiude (intenzionalmente o non intenzionalmente), guarda tutti i segnali di ritorno impostati dalla mia app. Questo può essere usato per istruire lo script a copiare in un aggiornamento, riavviare o chiudere. Se la mia app si arresta in modo anomalo, non viene restituito alcun segnale, quindi lo script riavvierà la mia app e mi invierà un'e-mail con le ultime righe dell'output della console.

Vedi Sviluppo di servizi simili a Windows in LINUX utilizzando MONO ?

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top