Edit script shell en cours d'exécution
Pouvez-vous éditer un script shell en cours d'exécution et que ces modifications affectent l'exécution du script?
Je suis curieux de connaître le cas particulier d'un script csh j'ai ce lot exécute un tas de différentes construire des saveurs et fonctionne toute la nuit. Si quelque chose se produit pour moi milieu de l'opération, j'aimerais aller dans et ajouter d'autres commandes, ou un commentaire de l'onu exécuté ceux.
Si pas possible, est-il un shell ou un lot mécanisme qui me permettrait de faire cela?
Bien sûr, je l'ai essayé, mais ça sera des heures avant de voir si cela a fonctionné ou pas, et je suis curieux de savoir ce qui se passe ou ne se passe pas derrière les coulisses.
- J'ai vu deux résultats à partir de l'édition du fichier de script pour l'exécution d'un script: 1) les changements sont ignorés, comme si elle avait lu tout ça en mémoire ou 2) le script se bloque avec une erreur comme si elle avait lu une partie de la commande. Je ne sais pas si c'est dépendante de la taille du script. De toute façon, je ne pourrais pas l'essayer.
- En bref: non, sauf si c'est de l'auto-référentielle/appeler, dans ce cas le script principal serait encore à l'ancienne.
- Il y a deux questions importantes ici. 1) Comment puis-je correctement et en toute sécurité ajouter des commandes à l'exécution d'un script? 2) Quand je modifie l'exécution d'un script, ce qui va arriver?
- La question est de savoir si un shell exécute un script par la lecture de tout fichier de script, puis de l'exécuter, ou partiellement la lecture comme il l'exécute. Je ne sais pas qui il est; il pourrait même ne pas être spécifiée. Vous devriez éviter de fonction sur le comportement.
Vous devez vous connecter pour publier un commentaire.
Scripts ne fonctionnent pas de cette façon; l'exécution de la copie est indépendant de la source de fichier que vous modifiez. La prochaine fois que le script est exécuté, il sera basé sur la dernière version enregistrée du fichier source.
Il pourrait être sage de sortir ce script sur plusieurs fichiers, et de les exécuter individuellement. Cela permettra de réduire le temps d'exécution à l'échec. (c'est à dire, de diviser le lot dans un build de la saveur les scripts, l'exécution de chacun d'eux individuellement pour voir qui est à l'origine du problème).
[modifier] Voir aussi cette réponse, section 3 pour des solutions de contournement.
Il ne affecter, au moins bash dans mon environnement, mais dans très désagréable façon. Voir ces codes. Première
a.sh
:b.sh
:Ne
Dans mon cas, la sortie est toujours:
C'est imprévisible, donc dangereux. Voir cette réponse, section 3 pour des solutions de contournement.
[ajouté] Le comportement exact dépend d'un saut de ligne supplémentaire, et peut-être aussi sur votre Unix saveur, système de fichiers, etc. Si vous souhaitez simplement voir quelques influences, il suffit d'ajouter "echo foo/bar" à b.sh avant et/ou après la "lecture" de la ligne.
b.sh
par l'ajout de 10 lignes de echo foo/bar/baz. L'essentiel des réponses par dave4220 et moi, c'est que l'effet n'est pas facile à prédire. (BTW le nom "affection" signifie "amour" =)Essayez ceci... créer un fichier appelé "bash-is-odd.sh":
Qui démontre que bash est, en effet, d'interpréter le script au fur et à mesure. En effet, la modification d'un script de longue durée a des résultats imprévisibles, l'insertion de caractères aléatoires etc. Pourquoi? Parce que bash lit à partir de la dernière position en octets, de sorte que les changements de montage l'emplacement de l'actuel caractère en cours de lecture.
Bash est, en un mot, très, très dangereux à cause de cette "fonctionnalité". svn et rsync lorsqu'il est utilisé avec scripts bash sont particulièrement troublant, parce que, par défaut, ils "fusionner" les résultats... de montage en place. rsync est un mode qui corrige ce. svn et git ne le font pas.
Je vous présente une solution. Créez un fichier appelé "/bin/bashx":
Maintenant utiliser #!/bin/bashx sur vos scripts et toujours les exécuter avec "bashx" à la place de bash. Cela résout le problème - vous pouvez en toute sécurité rsync vos scripts.
Alternative (en ligne) solution proposée/testée par @AF7:
Accolades protéger contre les modifications et quitter le protège contre les ajoute. Bien sûr, nous serions tous beaucoup mieux si bash est venu avec une option, comme '-w' (ensemble de fichiers), ou quelque chose qui l'a fait.
Casser votre script dans les fonctions de, et chaque fois qu'une fonction est appelée, vous
source
à partir d'un fichier distinct. Ensuite, vous pouvez éditer les fichiers à tout moment et l'exécution de votre script va chercher les modifications prochaine fois qu'elle sera disponible.Bonne question!
Espérons que ce script simple qui permet de
Il semble bien sous linux que les modifications apportées à un agent d'exécution .les poissons sont édictées par l'exécution du script, si vous pouvez taper assez vite!
Je n'ai pas de csh installé, mais
Exécuter, de modifier rapidement la dernière ligne lire
De sortie est
Hrmph.
Je suppose que des modifications de scripts shell ne prennent pas effet jusqu'à ce qu'ils sont nouveau.
Change didn'ned
.Si c'est tous en un seul script, alors non il n'y aura pas de travail. Toutefois, si vous définissez comme un pilote de script d'appel des sous-scripts, alors vous pourriez être en mesure de modifier un sous-script avant on l'appelle, ou avant qu'il appelle de nouveau si vous êtes en boucle, et dans ce cas je pense que ces changements seraient reflétés dans l'exécution.
Une intéressante note de côté, si vous exécutez un script Python, il ne change pas. (C'est probablement le plus évident pour quelqu'un qui comprend comment le shell exécute des scripts Python, mais pensé qu'il pourrait être un rappel utile pour quelqu'un qui cherche pour cette fonctionnalité.)
J'ai créé:
Puis dans un autre shell, alors que c'est de dormir, de modifier la dernière ligne. Lors de cette opération terminée, il affiche la inchangée ligne, sans doute parce qu'il est en cours d'exécution d'un
.pyc
? Même chose sur Ubuntu et macOS.J'entends pas... mais avec quelques indirection:
BatchRunner.sh
Command1.sh
Command2.sh
Alors vous devriez être en mesure de modifier le contenu de chaque fichier de commande avant BatchRunner obtient-il le droit?
OU
Une version plus propre serait BatchRunner look dans un seul fichier où il serait consécutivement exécuter une ligne à la fois. Ensuite, vous devriez être en mesure de modifier ce second fichier, tandis que le premier est en cours d'exécution à droite?
généralement, rare de modifier votre script pendant son fonctionnement. Tout ce que vous avez à faire est de mettre dans le contrôle de vos opérations. Utiliser des if/else pour vérifier les conditions. Si quelque chose tombe en panne, ce faire, d'autre le faire. C'est le chemin à parcourir.