Hoe codeer ik een Mono Daemon

Ik probeer een Mono C#-daemon voor Linux te schrijven.

Ik wil er graag een begin en einde van maken wanneer het klaar is met verwerken in plaats van het proces alleen maar te beëindigen.

Heeft iemand hier voorbeelden van?

Bewerken: ik heb ontdekt hoe ik start-stop-daemon –background in debian moet gebruiken, dus ik denk dat ik dat voorlopig maar ga gebruiken.

Bewerken: ik implementeer dit ook in Java en ze hebben deze leuke addShutdownHook die het beëindigen van de app opvangt. Ik moet wat meer tijd besteden aan het uitzoeken van de afhankelijkheden voor mono-service, of een manier vinden om app-beëindiging te vangen.

Er is de SessionEnd-gebeurtenis, maar die is alleen beschikbaar voor services en niet voor console-apps

Antwoord:
mono-service gebruiken om een ​​Windows-service op linux in te pakken


Antwoord 1, autoriteit 100%

Als je meldingen wilt ontvangen op de Unix-manier, dat wil zeggen met behulp van signalen, wil je de Mono.Unix.UnixSignalvoor elk signaal dat u van plan bent te ontvangen en bel vervolgens UnixSignal.WaitAny () op een reeks signalen.


U zou dit normaal gesproken in een aparte thread doen.


Antwoord 2, autoriteit 76%

U moet een service implementeren en monoservice gebruiken. Google ernaar en je zult verschillende voorbeelden vinden.


Antwoord 3, autoriteit 64%

Een eenvoudige methode zou zijn om te luisteren op een (lokale, hoge) poort en opdrachten te ontvangen van een beheerclient, zoals bind dat doet.

Een meer unix-achtige manier zou zijn om registreer een signaalhandlermet behulp van UnixSignalen correct afsluiten bij ontvangst van een bepaald signaal. Zie de Mono FAQ, “Kan ik signaalbehandelaars gebruiken met Mono?”voor waarschuwingen en een voorbeeld.

lupusheeft mono-service, een hostingproces dat gebruikmaakt van de ServiceProcess-interfaces. Helaas vereist dit het instellen van MONO_DISABLE_SHM, waardoor sommige functies in Mono worden uitgeschakeld, met name cross-process IPC-systemen.


Antwoord 4, autoriteit 16%

Een daemon onder Linux luistert doorgaans naar signalen, zoals het kill-signaal, maar er zijn andere die het mogelijk maken om dingen te doen zoals een zachte herstart (leest terug in de configuratie), enzovoort.

Normaal gesproken gaat dit vergezeld van een script in de map /etc/init.d dat het starten en stoppen van dergelijke daemons regelt. Gewoonlijk wordt een pid-bestand gemaakt onder /var/run, dat de proces-ID voor het script bewaart om het proces snel te identificeren.

Zelfs als je codeert voor Mono, zou je er goed aan doen de omgeving waarvoor je codeert te begrijpen, aangezien er geen verschil is tussen een Mono-proces of een native proces (bijvoorbeeld gemaakt in C) of een script.

p>

Dave


Antwoord 5

Miguel de Icaza schreef onlangs over een nieuwe Mono C# interactieve shelldie u gemakkelijk genoeg zou moeten kunnen demoniseren. Miguel heeft een vervolgartikelmet een broncode die laat zien hoe u kunt de interactieve shell in andere C#-toepassingen opnemen. Het kan dienen als een goed startpunt voor uw daemon.

Houd er rekening mee dat de interactieve shell Mono versie 2.2 vereist, die nog niet is uitgebracht. De code is echter beschikbaar in Mono’s svn repository.


Antwoord 6

David heeft gelijk, het stoppen van een service wordt bereikt via een UNIX-signaal en je moet een signaalhandler gebruiken om het op te vangen.


Antwoord 7

Als alternatief gebruik ik een shellscript. Het start mijn mono-app en wanneer mijn app stopt (opzettelijk of onbedoeld), kijkt het naar eventuele retoursignalen die mijn app heeft ingesteld. Dit kan worden gebruikt om het script opdracht te geven om bij een update te kopiëren, opnieuw op te starten of af te sluiten. Als mijn app crasht, wordt er geen signaal geretourneerd, dus het script zal mijn app opnieuw opstarten en me een e-mail sturen met de laatste paar regels van de console-uitvoer.

Zie Ontwikkeling van Windows-achtige services in LINUX met MONO ?

Other episodes