Sous Linux, qu'arriverait-il à un programme en cours d'exécution lorsque son fichier exécutable a été modifié ou supprimé?

12

Disons que /usr/local/bin/rubys'exécute en arrière-plan, puis nous remplaçons rubypar une version différente, voire supprimons ruby.

Qu'adviendra-t-il de ceux qui exécutent des processus Ruby?

Cheng
la source

Réponses:

10

Cela dépend exactement de la façon dont l'exécutable est mis à jour. Si le même fichier est ouvert et que certaines parties sont modifiées, de mauvaises choses se produiront. S'il est supprimé, le fichier est supprimé de la structure de répertoires du système de fichiers, mais pas réellement dissocié (c'est-à-dire supprimé) jusqu'à ce que le dernier processus qui l'a ouvert ait exécuté, il se termine. Donc, si l'exécutable est supprimé et un nouveau avec le même nom écrit à sa place, l'ancien devrait continuer à fonctionner correctement.

KeithB
la source
"Si le même fichier est ouvert et des parties de celui-ci sont modifiés" n'est pas égal à "si l'exécutable est supprimé et un nouveau avec le même nom écrit à sa place" ?? Voulez-vous dire mv nouveau fichier à l'ancien fichier est mauvais mais rm ancien fichier puis cp nouveau fichier à l'ancien emplacement de fichier est ok?
jean
4

Ils continueront. Peut-être tomber en panne horriblement s'ils essaient d'accéder à eux-mêmes et reçoivent quelque chose de complètement faux. Je ne le ferais pas à moins d'y être obligé :)

Phoshi
la source
Oui. Je mets à jour manuellement le logiciel tout le temps pendant l'exécution des scripts.
John T
1
Pour les scripts, il est important d'avoir de réels interprètes récents qui fonctionnent avec le descripteur de fichier initialement ouvert. Dans ce cas, c'est bien tant que vous remplacez le fichier et que vous ne le modifiez pas. Pour les fichiers binaires, ils fonctionnent généralement sur le FD mappé de manière interne, donc ce n'est pas un problème (sauf si vous modifiez les fichiers). Mais il peut y avoir des applications qui ouvrent le nom de fichier pour inspection et cela peut être risqué (je ne peux cependant pas donner d'exemple négatif). La plupart des distributions / gestionnaires de packages Linux fonctionnent avec l'hypothèse que le remplacement des binaires et des bibliothèques (pour une durée limitée) est correct.
2017 à 18h14
1

Qu'adviendra-t-il de ceux qui exécutent des processus Ruby?

  1. faire une copie de / usr / local / bin / ruby
  2. [s'il ne fonctionne pas, exécutez / usr / local / bin / ruby]
  3. essayez: rm / usr / local / bin / ruby
  4. et voyez par vous-même :)
JohnM2
la source
1

Je crois comprendre que le noyau Linux a un composant appelé le chargeur qui ouvre le fichier exécutable lui-même, contenant l'image, pendant le processus de chargement / liaison, et une fois terminé avec la liaison aux bibliothèques, etc., le chargeur ferme le fichier. Ainsi, ce processus se produit et est terminé au moment où le noyau lance réellement le processus.

Je ne sais pas si l'exécutable d'origine sur le disque doit être référencé si l'exécutable essaie ultérieurement d'importer des bibliothèques externes.

Je dirais, et d'après mon expérience, si vous supprimez l'exécutable sur le disque, l'exécutable chargé en mémoire n'est pas affecté. De même, si le fichier exécutable est remplacé par une version plus récente, les versions en cours d'exécution ne sont pas mises à jour "automatiquement" sauf si elles sont arrêtées et relancées.

J'ai eu des problèmes avec un contrôleur RAID qui a fait que le disque entier sur lequel le répertoire racine et les autres partitions étaient montées agissait soudainement comme s'il était déconnecté. Impossible de charger de nouveaux programmes, mais ceux en mémoire fonctionnaient bien, jusqu'à ce qu'ils aient besoin de fichiers du disque.

LawrenceC
la source
Cela ne semble pas très efficace. Je pense que Windows le mapperait en mémoire à la place, donc les pages sont chargées à la demande.
sashoalm