Puis-je modifier un fichier script (.sh) pendant qu'il est en cours d'exécution?

26

Supposons que j'ai un script script.sh , ce qui prend du temps à exécuter. Je l'exécute, ./script.sh . Pendant qu'il s'exécute dans une fenêtre de terminal, je modifie le fichier script.sh . Cela aura-t-il un effet sur le processus en cours d'exécution?

Après l'avoir modifié, j'exécute le fichier modifié, j'ai donc deux processus en cours maintenant. Est-ce que ça va?

    
posée becko 16.06.2014 - 16:22
la source

4 réponses

34

Lorsque vous apportez des modifications à votre script, vous effectuez les modifications sur le disque (disque dur - le stockage permanent); Lorsque vous exécutez le script, le script est chargé dans votre mémoire (RAM).

Ainsi, les modifications que vous apportez au script n’affecteront pas le script en cours d’exécution, il exécutera la version que vous avez exécutée avant d’effectuer ces modifications.

Cependant, lorsque vous exécutez à nouveau le script modifié sans terminer l’instance précédemment exécutée, il y aura deux instances du script, l’une contenant les modifications et l’ancienne.

Soyez averti que les ressources utilisées et modifiées par le script seront en conflit. Par exemple, si vous modifiez un fichier à l'aide du script, le script qui s'exécutera ultérieurement ne pourra pas ouvrir ce fichier pour l'écriture et ne s'exécutera pas correctement.

Mise à jour: Merci à l'utilisateur enregistré pour m'avoir indiqué une meilleure réponse sur Unix.stackexchange.com.

Selon la taille du script et le compilateur / interpréteur en question, le script est chargé partiellement / complètement. Ainsi, si le script n'est pas complètement chargé, les modifications apportées à votre script se répercuteront sur l'instance en cours d'exécution une fois que la partie du script sera chargée en mémoire.

Par conséquent, il est déconseillé de modifier votre script sur le disque en cours d'exécution pour obtenir une sortie imprévisible: arrêtez d'abord l'instance en cours d'exécution, puis modifiez votre script, puis réexécutez le script.

    
réponse donnée jobin 16.06.2014 - 16:24
la source
4

J'ajouterai quelque chose qui, je pense, n'a pas été dit dans les autres réponses. Tout dépend de comment vous éditez le fichier. Faire de echo "stuff" >file à partir du shell (une autre instance) écrasera en effet le fichier, je pense. Mais si vous modifiez le fichier avec par exemple emacs puis enregistrez, cela n'arrivera pas. Au lieu de cela, l'éditeur renomme l'ancien fichier en un nom de sauvegarde (supprimant peut-être la sauvegarde précédente), puis écrit son contenu modifié en tant que nouveau avec l'ancien nom (maintenant libéré) Comme le shell (ou un autre interpréteur) lisant le script n'ouvrira presque certainement le fichier qu'une seule fois, il est ensuite indépendant de la localisation du fichier nom , il continue simplement à lire le fichier de disque physique (identifié). par numéro d'inode) associé au nom du fichier au moment de l'ouverture. Ainsi, même s'il lit le script en blocs (ce qui serait la solution la plus simple si vous utilisez des E / S de texte en mémoire tampon), il continuerait à lire les lignes de l'ancienne instance du fichier, ce qui risque de ne pas être modifié.

    
réponse donnée Marc van Leeuwen 16.06.2014 - 18:52
la source
0
La réponse de

@ jobin est généralement correcte, mais j'ajouterai d'autres réponses qui pourraient être pertinentes, selon ce que vous voulez faire.

Si vous voulez changer le script et que vous voulez savoir qu’il est sûr, alors vous voulez écrire dans un nouveau fichier, pas dans le fichier existant. Le nouveau fichier peut être situé à l’ancien. Ecrivez votre nouvelle version dans un nouveau fichier, puis utilisez mv pour la placer sur le dessus de l’ancien. Le fichier qui a été remplacé existe toujours, il n'est pas lié au répertoire. Votre script en cours d'exécution peut continuer à l'utiliser, et lorsque ce script ferme son descripteur de fichier, le système sait qu'il peut nettoyer le fichier en toute sécurité (immédiatement ou ultérieurement).

Si vous voulez vous comporter à la volée, vous rencontrez un problème plus difficile. Je pense que vous devez le construire dans le code du script. Les scripts Bash peuvent gérer les signaux (par exemple, ils peuvent intercepter quelque chose comme kill -USR1 [pid] ), et un script peut alors répondre en rechargeant du code. Alors peut-être que vous pouvez obtenir des fonctionnalités proches de ce que vous voulez, mais sans savoir ce que vous recherchez, je ne vois pas une bonne raison de le faire, et je suppose que si vous voulez faire quelque chose de ce complexe, vous voudrez probablement langage de programmation pour le faire.

Si vous voulez pirater le comportement d’un script en cours d’exécution qui n’est pas écrit dans cette optique, alors vous n’avez pas de chance. J'hésiterais à appeler toute tâche de programmation impossible, mais si vous aviez les ressources et les compétences pour ce type de tâche, vous ne le demanderiez probablement pas ici.

    
réponse donnée mc0e 16.06.2014 - 18:27
la source
0

cela doit être mis à jour, les réponses ci-dessus ne sont plus que partiellement correctes:

avec la version actuelle de bash, modifier un script sur disque pendant son exécution obligera bash à "essayer" de charger les modifications dans la mémoire et de les utiliser dans le script en cours d'exécution. Si vos modifications interviennent après la ligne en cours d'exécution, les nouvelles lignes seront chargées et exécutées. mais c'est une supposition de bash et cela peut être correct ou faux.

la meilleure façon de le faire est la séquence d’actions suivante: 1) charger le script en mémoire 2) supprimer le script du disque 3) écrire un nouveau script sur le disque En supprimant d'abord la version du disque, la version de la mémoire perd ses liens pour que, lorsque vous fournissez une nouvelle version à l'étape 3, aucune tentative de chargement du nouveau contenu dans la version de la mémoire ne soit effectuée par bash.

    
réponse donnée ivor 12.03.2017 - 16:53
la source

Lire d'autres questions sur les étiquettes