Je sais que les démons doivent être envoyés une HUP pour les modifications de configuration pour prendre effet. Mais je me demande pourquoi ceci est, et s'il est possible de créer un démon sensible à de tels changements.
Il y a plusieurs raisons. Une raison majeure est que de nombreux daemons ont plusieurs fichiers de configuration, et tout changement de fichier unique pourrait ne pas être utilisable à ses propres - disposer d'une tentative de démon de recharger sa configuration chaque fois que l'un de ses modifications de fichier de configuration pourrait entraîner davantage de problèmes.
D'un point de vue purement associé à la mise en œuvre, il faut regarder les modifications apportées aux fichiers de configuration ajoute plus de complexité au démon. Les démons ont une boucle centrale de quelque sorte, vérifiant le travail à effectuer correspondant au but de base du démon; La vérification des modifications apportées aux fichiers de configuration ne correspond pas nécessairement à ce but de base.
Gestion d'un signal séparé résoue à la fois ces problèmes: il indique que l'utilisateur pense que la configuration est cohérente et est sûre à recharger, et il peut être mis en œuvre de manière asynchrone dans un gestionnaire de signal (généralement comme un changement de drapeau de base), tout en minimisant l'impact. sur la boucle principale (il réagit au changement de drapeau).
Il y a des démons qui réagissent aux changements de configuration par eux-mêmes; cron
Par exemple, vérifie ses fichiers de configuration pour les modifications à chaque fois qu'elle passe à sa boucle principale.
Outre toutes les autres raisons mentionnées dans les autres réponses, il y a une raison plus profonde, philosophique, et c'est l'un des principes fondamentaux de la conception de programmation UNIX: faire une chose et le faire bien.
Dans UNIX, les programmes font généralement une chose et une chose seulement. Des opérations plus complexes sont réalisées en combinant plusieurs programmes.
Maintenant, servant des sites Web (par exemple) qui est une chose. Regarder des fichiers pour des changements, c'est une autre chose. Donc, selon la devise UNIX, celles-ci devraient être deux programmes différents, car un serveur Web par ex. Serser des sites Web et Les fichiers de montres des changements ne feraient pas le faire ne chose et le faire bien, cela ferait deux choses. Et des programmes qui font deux choses très souvent au moins une de ces deux choses pas très bien. (Par exemple, la personne qui a écrit le serveur Web pourrait être un expert en HTTP, mais pas un expert en observation de fichiers.)
Pour les démons de réseau de réseaux spécifiquement, il existe également une autre raison de garder à la chose une chose de mantra: la sécurité. Chaque ligne de code est un bug potentiel. Le code le plus sécurisé n'est pas de code. En supprimant les responsabilités du démon qui n'appartiennent pas là, vous réduisez la quantité de code et donc la surface d'attaque.
Outre le fait que des programmes qui font de multiples choses font souvent au moins une de ces multiples choses, il existe une autre raison de diviser les responsabilités: Réutilisation de code. Si la surveillance du fichier faisait partie du serveur Web, votre serveur SSH doit également implémenter la surveillance des fichiers. Et votre serveur de fichiers. Et votre serveur de discussion. Et votre serveur de téléphonie. Et votre serveur de base de données. Et votre serveur de diffusion multimédia. Et ainsi de suite.
ATTENDU QUE Si la surveillance du fichier est la responsabilité d'un programme distinct, ce programme doit alors être mis en œuvre ne fois, testé une fois, optimisé une fois, documenté une fois, etc. Vous n'avez également besoin que de former des personnes une fois que Utilisez-le, puis ils peuvent l'appliquer à chaque démon jamais écrit, et même à chaque démon unique qui sera écrit à l'avenir.
Ainsi, si Vous vouliez faire ce que vous demandez dans votre question, vous auriez deux Daemons: un que, par exemple, par exemple. SERVES DES SITES WEB ET UNE QUI SUR LES FICHIERS POUR CHANGEMENTS ET EXÉCUTES UNE ACTION basée sur ces changements.
Et, cela ne devrait probablement pas venir comme une surprise, ces démons existent déjà.
Ajout à d'autres réponses: l'un des plus gros obstacles aurait besoin de chaque valeur de configuration d'avoir une interprétation au courant, au minimum, l'état actuel de l'application, la valeur précédente et les autres valeurs ont changé. En général, le fichier de configuration indique au démon sur la manière de passer d'un état non fonctionnant à son état initial. Pour que le démon recharger sa configuration sur les modifications signifie également pouvoir interpréter les valeurs de configuration comme modifications de l'état actuel du démon. Par exemple, considérons une sorte de démon de tâches. Dans sa configuration pourrait être worker_threads: 2
. Si le démon commence juste, l'interprétation est simple: créer deux threads pour exécuter des tâches. Si vous avez besoin de gérer une modification à cette valeur, vous devez maintenant faire plusieurs choses - si le nombre de threads a été augmenté, ajoutez plus de threads. Si cela a été diminué, retirez quelques discussions.
Non seulement l'interprétation de la modification dépendante de la valeur précédente, elle dépend également de l'état actuel du démon. Si vous mettez à jour la configuration sur worker_threads: 1
, alors quel devrait faire le démon si les deux threads sont utilisés? Devrait-on être tué pour correspondre immédiatement à l'état décrit dans la configuration? Les tâches doivent-elles être autorisées à fonctionner à la fin et à un thread est-il tué?
Passé cela, l'interprétation de la modification de la valeur de configuration dépend également de laquelle les autres valeurs de configuration ont été modifiées. Disons qu'il y a une valeur de configuration supplémentaire pour déterminer quoi faire lorsque nous réduisons le nombre de threads de travail pendant que tous les travailleurs sont utilisés: kill_threads_on_worker_reduction: true/false
. Eh bien, si cela est défini, nous pouvons déterminer s'il faut tuer les threads de travailleurs actifs ou non. Mais que si cette valeur de configuration était aussi changé? Est-ce que cela ne s'applique qu'à partir de nouvelles tâches en cours d'exécution ou s'applique-t-il rétroactivement aux tâches qui ont commencé avant le changement?
Ceci est juste de forer à ne valeur de configuration possible. Vous devriez comprendre cela pour chaque valeur de configuration, pour chaque état d'application possible et pour toute combinaison possible de valeurs modifiées.
Bien qu'il existe certainement des cas où l'interprétation des changements de configuration est beaucoup plus simple, cela aide à expliquer pourquoi les modifications de configuration en direct-rechargement en direct ne sont généralement pas faciles à faire.