Mise à jour des bibliothèques partagées sans des processus de redémarrage
Si mon processus de chargement d'un .donc, bibliothèque et si une nouvelle version de la bibliothèque est disponible est-il possible de passer à la nouvelle bibliothèque sans faire un redémarrage du processus ? Ou la réponse dépend des choses comme si il y a un changement de paramètre à l'une des fonctions existantes dans la bibliothèque ?
Je travaille dans un assez grand système qui exécute 100s des processus et à chaque chargement de 10s de bibliothèques. Les bibliothèques fournissent des fonctionnalités spécifiques et sont fournis par des équipes distinctes. Ainsi, lorsque l'une des modifications de bibliothèque (pour une correction de bug permet de dire) idéal serait de le publier sous le capot, sans impact sur les processus en cours d'exécution. Est-il possible ?
MODIFIER Merci! Dans mon cas quand une nouvelle bibliothèque est disponible tous les processus en cours d'exécution ont commencer à l'utiliser. Ses pas l'option de les laisser courir avec l'ancienne version pick-up " et le nouveau plus tard. Donc, il semble que l'option la plus sûre est de simplement recharger le processus.
- À moins que vous contrôlez tous les exécutables, les hot-mise à jour des fichiers n'est pas possible sans laide des hacks comme ptracing processus. Aussi, linux n'utilise pas de dll.
Vous devez vous connecter pour publier un commentaire.
Vous ne pouvez pas mettre à niveau une bibliothèque liée à la volée grâce à un processus en cours d'exécution.
Vous pouvez même essayer, mais si vous succed (et vous ne serez pas échouer avec un "fichier de texte est en cours d'utilisation" message d'erreur), vous devez redémarrer le processus, à faire la cartographie de la nouvelle bibliothèque en mémoire.
Vous pouvez utiliser la commande lsof pour vérifier que les bibliothèques sont liées (à l'exécution ou linktime):
lsof -p <pid>
, vous pouvez également utiliserpldd <pid>
.dlopen
/dlclose
existent dans le but d'être en mesure de réaliser cette chose avec dynamiquement lié libs.Une technique intéressante, même si elle est quelque peu sujette à l'échec dans le point de contrôle de l'étape de restauration, c'est de faire une invisible redémarrer.
Votre processus de serveur ou quoi que ce soit, enregistre toutes ses informations nécessaires dans les fichiers de disque. Y compris le descripteur de fichier numéros et les états actuels. Ensuite, le processus serveur ne un
exec
appel système pour exécuter lui-même, en remplacement de l'actuelle version de lui-même. Ensuite, il lit son état à partir du disque les fichiers et les curriculum vitae au service de ses descripteurs de fichiers comme si de rien n'était.Si tout va bien, le redémarrage est invisible, et le nouveau processus est à l'aide de toutes les bibliothèques mises à jour.
irssi
et ses/upgrade
de commande.À tout le moins, vous devez vous assurer que l'interface de la bibliothèque n'a pas changé entre les versions. Si c'est assuré, alors je voudrais essayer de regarder dans le chargement dynamique de l'bibliothèques avec dlopen/dlsym et voir si dlclose vous permet de re-charger.
Je n'ai jamais fait de tout cela moi-même, mais c'est le chemin que j'avais poursuivre en premier. Si vous allez de cette façon, pourriez-vous publier les résultats?
Linux fournit plusieurs chargeur dynamique des interfaces et processus de charge dynamique de la bibliothèque lors de l'exécution. dlopen et dlsysm fourni par linux peut résoudre votre problème.
Si vous vous attendez à libaries de changer assez régulièrement, et
vous vous attendez à maintenir le temps, je pense que votre système
devrait être re-conçu de telle sorte que ces bibliothèques deviennent réellement
faiblement couplé composants (par exemple, les services).
Cela dit, ma réponse à la question est oui: dans certaines
circonstances, il possible de mettre à jour les bibliothèques partagées sans
des processus de redémarrage. Dans la plupart des cas, j'attends qu'il n'est pas possible,
par exemple, lorsque l'API de votre bibliothèque de change, lorsque le
arrangement de votre segment de données change, lorsque la bibliothèque
maintient des threads. La liste est assez longue.
Pour les très petites corrections de bugs pour le code, vous pouvez toujours faire usage
de ptrace écrire dans le processus de la mémoire de l'espace, et de
il y refaire ce /lib/ld-linux.donc en termes de dynamique
de la liaison. Honnêtement, il est extrêmement complexe de l'activité.
ldd le binaire de votre processus est une façon de le savoir. bien qu'il soit théoriquement possible, il est conseillé de ne pas bricoler avec le processus en cours d'exécution, même si je suis sûr que les services publics existent comme ksplice que de bricoler avec le fonctionnement du noyau linux.
vous pouvez simplement mettre à niveau et les processus en cours d'exécution continuera avec l'ancienne version, et ramasser la nouvelle version lorsqu'il redémarre, en supposant que votre système de gestion de paquets est bon et il sait ce qui est comptible à installer.
Vous voudrez peut-être savoir à propos de la bibliothèque partagée de contrôle de version et la ld
-h
option.Une façon de l'utiliser est comme suit:
Vous de maintenir un compteur version de votre système de construction. Vous construisez la bibliothèque partagée avec:
cependant, vous le mettez dans votre arborescence de développement de la lib que tout simplement
mylibrary.so
. (Il y a aussi un hack impliquant de mettre l'ensemble .afin de dans un .un fichier).Maintenant, au moment de l'exécution, les processus à l'aide de la bibliothèque de regarder pour le bien-versionnées nom. Déploiement d'une nouvelle version, vous venez de ajouter la nouvelle version de l'image. Programmes en cours d'exécution liés à l'encontre de l'ancienne version de continuer à l'utiliser. Comme les programmes sont réédités et testé contre le nouveau, le déploiement de nouveaux exécutables.
Parfois, vous pouvez mettre à niveau un en cours d'utilisation .de la sorte, et parfois vous ne pouvez pas. Cela dépend principalement de la façon dont vous essayez de le faire, mais aussi sur les garanties de sécurité du noyau que vous utilisez.
Ne pas faire ceci:
chat nouveau.donc > vieux.donc
...parce que finalement, votre processus peut essayer à la demande de la page quelque chose, et de trouver que ce n'est pas dans la bonne plus de point. C'est un problème parce que les adresses de choses peuvent changer, et c'est toujours le même inode; vous êtes juste d'écraser les octets dans le fichier.
Toutefois, si vous:
mv nouveau.si vieux.donc
Vous serez OK sur la plupart des systèmes, parce que votre processus en cours d'exécution peut retenir un maintenant-sans nom d'inode pour l'ancien de la bibliothèque, tandis que de nouvelles invocations de votre processus d'obtenir le nouveau fichier.
MAIS, certains noyaux n'aime pas vous laisser mv une utilisation .donc, peut-être par prudence, peut-être pour leur simplicité.