Question

J'essaie d'écrire un démon Mono C # pour Linux.

Je voudrais faire un début et une fin lorsque son traitement est terminé au lieu de simplement tuer le processus.

Quelqu'un at-il des exemples de cela?

Edit: j'ai compris comment utiliser start-stop-daemon --background dans debian, je pense donc que je vais simplement l'utiliser pour l'instant.

Edit: J'implémente cela également en java et ils ont cette jolie option addShutdownHook qui interrompt l'application. Je dois passer un peu plus de temps à trier les dépendances pour le service mono ou à trouver un moyen d'attraper la fin de l'application.

Il existe un événement SessionEnd, mais disponible uniquement pour les services et non pour les applications de la console

Réponse: utiliser mono-service pour envelopper un service Windows sur linux

Était-ce utile?

La solution

Vous devez implémenter un service et utiliser mono-service. Google pour cela et vous trouverez plusieurs exemples.

Autres conseils

Pour recevoir des notifications sous la forme Unix, qui utilise des signaux, vous souhaitez utiliser le Mono.Unix.UnixSignal pour chaque signal que vous prévoyez de recevoir, puis appelez UnixSignal.WaitAny () sur un tableau de signaux.

Vous le feriez généralement sur un thread séparé.

Une méthode simple consisterait à écouter sur un port (local, élevé) et à recevoir les commandes d’un client de gestion, comme l’affecte bind.

Une méthode plus unix-ish serait de enregistrez un gestionnaire de signaux en utilisant UnixSignal et correctement lors de la réception d’un certain signal. Consultez la FAQ Mono, "Puis-je utiliser des gestionnaires de signaux avec Mono? pour mises en garde et un exemple.

lupus a trouvé mono-service , qui est un processus d'hébergement utilisant le ServiceProcess . Malheureusement, cela nécessite de définir MONO_DISABLE_SHM , ce qui désactive certaines fonctionnalités de Mono, en particulier les systèmes IPC multi-processus.

Un démon sous Linux écoute généralement des signaux, tels que le signal de suppression, mais il en existe d'autres qui lui permettent d'effectuer des tâches telles qu'un redémarrage à chaud (lecture en configuration), etc.

Cela est généralement accompagné d'un script dans le répertoire /etc/init.d qui contrôle le démarrage et l'arrêt de tels démons. Généralement, un fichier pid est créé sous / var / run, qui conserve l'identifiant du processus afin que le script puisse l'identifier rapidement.

Même en codant pour Mono, vous comprendrez bien l'environnement pour lequel vous codez, car il n'y a pas de différence entre un processus Mono et un processus natif (créé en C, par exemple) ou un script.

Dave

Miguel de Icaza a récemment écrit à propos d'un nouveau Mono C # interactive shell que vous devriez pouvoir démoniser assez facilement. Miguel a un article de suivi avec un code source qui montre comment vous pouvez inclure le shell interactif dans d'autres applications C #. Cela peut constituer un bon point de départ pour votre démon.

Notez que le shell interactif nécessite Mono version 2.2, qui n’a pas encore été publié. Le code est disponible dans le au référentiel svn de Mono , cependant.

David a raison, l’arrêt d’un service s’effectue via un signal UNIX et vous devez utiliser un gestionnaire de signal pour l’attraper.

Comme alternative, j'utilise un script shell. Il démarre mon application mono, puis lorsque mon application se ferme (intentionnellement ou non), examine tous les signaux de retour définis par mon application. Ceci peut être utilisé pour indiquer au script de copier une mise à jour, un redémarrage ou une fermeture. Si mon application se bloque, aucun signal n'est renvoyé. Le script redémarre donc mon application et m'envoie un courrier électronique contenant les dernières lignes de la sortie de la console.

Voir Développement de services similaires à Windows dans LINUX à l'aide de MONO ?

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top