2010-05-28 16 views
2

Sur une machine Solaris dans un "système de production mystérieux", j'exécute un script Perl qui fait référence à une variable d'environnement. Pas de gros problème.Est-ce que mon script Perl saisit des variables d'environnement depuis un "autre endroit"?

Le contenu de cette variable à partir du shell avant et après l'exécution est ce que j'attends.

Cependant, lorsqu'il est signalé par le script, il semble qu'il s'exécute dans un autre sous-shell qui bloque mes variables avec des valeurs différentes pour la durée du script.

Malheureusement, je ne peux vraiment pas coller le code. J'essaie d'obtenir un cas atomique, mais je suis à bout de nerfs ici.

+3

Courez-vous le script directement, tapé avec vos propres doigts sur votre propre shell? Ou est-ce que cela se passe à travers quelque chose d'autre comme cron ou sudo ou nohup ou un serveur web? – Schwern

Répondre

0

Ok, voici ce qui se passait:

perl lui-même était un tout à brouiller les pistes.

Le script s'exécutait dans un shell enfant qui, une fois créé, rechargeait les fichiers rc. Ces fichiers rc balayaient les variables d'environnement que j'avais manuellement ajoutées pendant le shell parent avec des copies de référence.

J'ai été capable de le démontrer avec un simple script csh qui vient de faire écho juste fait écho à l'environnement.

De-wonkifying mes fichiers rc (qui ont été écrasés avec wonkitude) éclairci le remplaçant mystique. MISE À JOUR: Le test qui a prouvé que c'était un "test.sh" qui avait une commande "set" simple. Il s'est avéré que le sous-shell n'hérite pas correctement de l'environnement parent. Bizarrement, lorsque j'ai basculé mon shell interactif parent vers ksh, l'environnement a commencé à hériter correctement.

0

1) Quelle version de Perl?

2) Certaines variables d'environnement peuvent être entachées par des processus enfants, je crois. Pouvez-vous faire un ps?

+0

Nous utilisons 5.8.4. Je ne peux malheureusement pas le faire. 1) c'est trop vite. 2) c'est un lien symbolique d'un script en lecture seule, donc je ne peux pas ajouter de pause pour le jouer afin que je puisse. –

+0

Pouvez-vous tuer le lien symbolique et créer une copie à cet endroit pour le débogage? –

+0

Ouais tu sais, je peux très bien être capable de faire ça. Il a de vastes vrilles avec l'exécution de sous-processus pour son but «en direct», mais en réfléchissant calmement, je ne vois aucune raison pour laquelle je ne pourrais pas au moins l'obtenir à la zone problématique dans un environnement isolé. –

2

Est-il possible que votre script ou les bibliothèques que vous utilisez soient en désordre avec le hachage% ENV?

+0

Bonne pensée, mais malheureusement pas. Il utilise seulement Sybase :: DBLIB et Net :: FTP. –

+12

Mettez 'BEGIN {utiliser Tie :: Trace; Tie :: Trace :: watch% ENV}' en haut de votre script (avant d'utiliser 'd'autres modules). Ensuite, vous recevrez un message d'avertissement chaque fois qu'une variable d'environnement change dans votre script Perl. – mob

+0

@mobrule: un bon conseil! Je ne savais jamais à ce sujet auparavant. –

1

Pouvez-vous exécuter le code via le débogueur Perl pour voir où cela se passe? Pouvez-vous vider le pid ($$) pour vérifier s'il est en train de forker ou d'invoquer des sous-couches? Alternativement, vous pouvez saupoudrer des instructions d'impression dans le code pour affiner le point où la variable d'environnement est modifiée, ou commencer à découdre des composants qui ne sont pas susceptibles d'être pertinents pour affiner sur le point de trouble.

+0

J'aime l'idée du débogueur Perl. Je continue d'oublier qu'il est là;) Pour le moment, nous avons trouvé une solution de contournement environnementale très étrange, donc, par souci d'opportunisme, je dois y aller (c'est à un niveau beaucoup plus élevé que ce symptôme.) Je suis clair de ce problème, je vais cloner la chose localement et voir si je ne peux pas comprendre comme vous le décrivez. Merci o / –