Sous Linux, je souhaite ajouter un démon qui ne peut pas être arrêté et qui surveille les modifications du système de fichiers. Si des changements sont détectés, il doit écrire le chemin d'accès à la console où il a été démarré plus une nouvelle ligne.
J'ai déjà le code de changement de système de fichiers presque prêt mais je ne peux pas comprendre comment créer un démon.
Mon code vient d'ici: http://www.yolinux.com/TUTORIALS/ForkExecProcesses.html
Que faire après la fourche?
int main (int argc, char **argv) {
pid_t pID = fork();
if (pID == 0) { // child
// Code only executed by child process
sIdentifier = "Child Process: ";
}
else if (pID < 0) {
cerr << "Failed to fork" << endl;
exit(1);
// Throw exception
}
else // parent
{
// Code only executed by parent process
sIdentifier = "Parent Process:";
}
return 0;
}
inotify
API. Voir:inotify_init
,inotify_add_watch
,inotify_rm_watch
.Réponses:
Les démons fonctionnent en arrière-plan et (généralement ...) n'appartiennent pas à un TTY, c'est pourquoi vous ne pouvez pas utiliser stdout / stderr comme vous le souhaitez probablement. Habituellement, un démon syslog ( syslogd ) est utilisé pour consigner les messages dans les fichiers (débogage, erreur, ...).
En plus de cela, il y a quelques étapes requises pour démoniser un processus.
Si je me souviens bien, ces étapes sont:
Pour vous donner un point de départ: Regardez ce code squelette qui montre les étapes de base. Ce code peut maintenant également être forké sur GitHub: squelette de base d'un démon linux
gcc -o firstdaemon daemonize.c
./firstdaemon
Vérifiez si tout fonctionne correctement:
ps -xj | grep firstdaemon
La sortie doit être similaire à celle-ci:
Ce que vous devriez voir ici, c'est:
(à cause du second fork ())
Lecture du syslog:
/var/log/syslog
Fait une:
grep firstdaemon /var/log/syslog
La sortie doit être similaire à celle-ci:
Remarque: en réalité, vous voudriez également implémenter un gestionnaire de signaux et configurer correctement la journalisation (fichiers, niveaux de journalisation ...).
Lectures complémentaires:
la source
fork()
, pourquoi ne pas simplement utilisersetsid()
?sigaction()
fonction fournit un mécanisme plus complet et plus fiable pour contrôler les signaux; les nouvelles applications devraient utilisersigaction()
plutôt quesignal()
.man 7 daemon
décrit comment créer un démon en détail. Ma réponse n'est qu'un extrait de ce manuel.Il existe au moins deux types de démons:
Démons SysV
Si vous êtes intéressé par le démon SysV traditionnel , vous devez implémenter les étapes suivantes :
Notez cet avertissement:
Notez que ce
daemon()
n'est pas conforme à POSIX .Démons de style nouveau
Pour les démons de nouveau style, les étapes suivantes sont recommandées:
Pour en savoir plus, lisez le tout
man 7 daemon
.la source
Vous ne pouvez pas créer un processus sous Linux qui ne peut pas être tué. L'utilisateur root (uid = 0) peut envoyer un signal à un processus, et il y a deux signaux qui ne peuvent pas être capturés, SIGKILL = 9, SIGSTOP = 19. Et d'autres signaux (lorsqu'ils ne sont pas interceptés) peuvent également entraîner l'arrêt du processus.
Vous voudrez peut-être une fonction de démonisation plus générale, où vous pouvez spécifier un nom pour votre programme / démon, et un chemin pour exécuter votre programme (peut-être "/" ou "/ tmp"). Vous pouvez également fournir des fichiers pour stderr et stdout (et éventuellement un chemin de contrôle en utilisant stdin).
Voici les éléments nécessaires:
Et voici une fonction plus générale,
Voici un exemple de programme, qui devient un démon, traîne, puis part.
Notez que SIG_IGN indique d'attraper et d'ignorer le signal. Vous pouvez créer un gestionnaire de signaux qui peut enregistrer la réception du signal et définir des indicateurs (tels qu'un indicateur pour indiquer un arrêt normal).
la source
Essayez d'utiliser la
daemon
fonction:Depuis la page de manuel :
la source
daemon(7)
manuel mentionne les étapes de création du démon et avertit que: Ladaemon()
fonction BSD ne doit pas être utilisée, car elle implémente seulement un sous-ensemble de ces étapes.daemon
La fonction est apparue pour la première fois dans 4.4BSD et n'est pas compatible POSIX .Je peux m'arrêter à la première exigence "Un démon qui ne peut pas être arrêté ..."
Pas possible mon ami; cependant, vous pouvez obtenir la même chose avec un bien meilleur outil, un module de noyau.
http://www.infoq.com/articles/inotify-linux-file-system-event-monitoring
Tous les démons peuvent être arrêtés. Certains sont plus facilement arrêtés que d'autres. Même une paire de démons avec le partenaire en attente, réapparaissant en cas de perte, peut être arrêtée. Vous devez juste travailler un peu plus dur.
la source
Si votre application fait partie des:
et cela ne vous dérange pas une dépendance NodeJS, puis installez NodeJS et ensuite:
Pour garder toutes les applications en cours d'exécution au redémarrage (et démoniser pm2):
Maintenant vous pouvez:
(vous permet également de surveiller facilement les changements de code dans votre répertoire d'applications et de redémarrer automatiquement le processus d'application lorsqu'un changement de code se produit)
la source
En appelant fork (), vous avez créé un processus enfant. Si le fork réussit (fork a renvoyé un PID différent de zéro), l'exécution se poursuivra à partir de ce point à partir du processus enfant. Dans ce cas, nous voulons quitter gracieusement le processus parent, puis continuer notre travail dans le processus enfant.
Peut-être que cela aidera: http://www.netzmafia.de/skripten/unix/linux-daemon-howto.html
la source
Un démon n'est qu'un processus en arrière-plan. Si vous souhaitez démarrer votre programme au démarrage du système d'exploitation, sous Linux, vous ajoutez votre commande de démarrage à /etc/rc.d/rc.local (exécutée après tous les autres scripts) ou /etc/startup.sh
Sous Windows, vous créez un service, enregistrez le service, puis configurez-le pour qu'il démarre automatiquement au démarrage dans l'administration -> panneau des services.
la source
Modèle de démon
J'ai écrit un modèle de démon en suivant le démon de nouveau style: lien
Vous pouvez trouver l'intégralité du code du modèle sur GitHub: ici
Main.cpp
Daemon.hpp
Daemon.cpp
daemon-template.service
la source