Problème avec .net application sous linux, ne fonctionne pas à partir d'un script shell

StackOverflow https://stackoverflow.com/questions/54503

  •  09-06-2019
  •  | 
  •  

Question

Je suis en train de travailler sur un .net post-commit hook à alimenter les données dans OnTime via leur Savon SDK.Mon crochet fonctionne sur Windows bien, mais sur notre production RHEL4 serveur subversion, il ne fonctionne pas lorsqu'il est appelé à partir d'un script shell.

#!/bin/sh
/usr/bin/mono $1/hooks/post-commit.exe "$@"

Quand je l'exécuter avec les paramètres de la ligne de commande, il fonctionne correctement.Lorsqu'il est exécuté par le shell script, j'obtiens l'erreur suivante:(il ressemble à il ya un problème avec le processus de l'exécution de SVN que j'utilise pour obtenir les données du journal de révision):

Unhandled Exception: System.InvalidOperationException: The process must exit before getting the requested information.
  at System.Diagnostics.Process.get_ExitCode () [0x0003f] in /tmp/monobuild/build/BUILD/mono-1.9.1/mcs/class/System/System.Diagnostics/Process.cs:149
  at (wrapper remoting-invoke-with-check) System.Diagnostics.Process:get_ExitCode ()
  at SVNLib.SVN.Execute (System.String sCMD, System.String sParams, System.String sComment, System.String sUserPwd, SVNLib.SVNCallback callback) [0x00000]
  at SVNLib.SVN.Log (System.String sUrl, Int32 nRevLow, Int32 nRevHigh, SVNLib.SVNCallback callback) [0x00000]
  at SVNLib.SVN.LogAsString (System.String sUrl, Int32 nRevLow, Int32 nRevHigh) [0x00000]
  at SVNCommit2OnTime.Program.Main (System.String[] args) [0x00000]

J'ai essayé d'utiliser mkbundle et mkbundle2 pour faire un stand alone qui pourrait être nommé post-commit, mais j'obtiens un message d'erreur différents:

Unhandled Exception: System.ArgumentNullException: Argument cannot be null.
Parameter name: Value cannot be null.
  at System.Guid.CheckNull (System.Object o) [0x00000]
  at System.Guid..ctor (System.String g) [0x00000]
  at SVNCommit2OnTime.Program.Main (System.String[] args) [0x00000]

Toutes les idées pour lesquelles elle pourrait être en défaut à partir d'un script shell ou de ce qui pourrait être mal avec la version groupée?

Edit: @Herms, J'ai déjà essayé avec un echo, et il ressemble à droite.Comme pour l' $1/hooks/post-commit.exe, J'ai essayé le script avec et sans chemin d'accès complet à l' .net de l'assemblée avec les mêmes résultats.

Edit: @Leon, J'ai essayé les deux $1 $2 et "$@" avec les mêmes résultats.C'est une subversion post-commit hook, et il prend deux paramètres, de sorte que ceux qui ont besoin d'être transmis à l' .net de l'assemblée.L' "$@" a été ce qui a été recommandé à la mono site pour l'appel d'une .net de l'assemblée à partir d'un script shell.Le script shell est l'exécution de l' .net de l'assemblée et avec les paramètres corrects, mais il est en train de lancer une exception qui n'est pas levée lors de l'exécuter directement à partir de la ligne de commande.

Edit: @Vinko, Je ne vois pas de différences dans l'environnement que les choses comme les autres BASH_LINENO et BASH_SOURCE

Edit: @Luc, Je fatigué, mais qui ne fait pas de différence non plus.J'ai d'abord remarqué le problème lors du test de TortoiseSVN sur ma machine (quand il fonctionne comme un sous-processus de la subversion démon), mais aussi trouvé que j'obtiens les mêmes résultats lors de l'exécution du script à partir de l'crochets répertoire (c'est à dire ./post-commit REPOS REV, où post-commit est la au-dessus de sh script.Faire mono post-commit.exe REPOS REV fonctionne très bien.Le principal problème est que pour l'exécuter, j'ai besoin d'avoir quelque chose de ce nom post-commit de sorte qu'il sera appelé.Mais il ne fonctionne pas à partir d'un script shell, et comme indiqué ci-dessus, le mkbundle ne fonctionne pas avec un autre problème.

Était-ce utile?

La solution

Il est normal que certains processus de traîner pendant un certain temps après ils ferment leur stdout (ie.vous obtenez une fin de la lecture du fichier d'eux).Vous devez appeler proc.WaitForExit() après la lecture de toutes les données, mais avant de vérifier ExitCode.

Autres conseils

Juste un hasard de la pensée qui pourrait aider au débogage.Essayez de modifier votre script shell:

#!/bin/sh
echo /usr/bin/mono $1/hooks/post-commit.exe "$@"

Vérifier et voir si la ligne de l'impression correspond à la commande que vous attendez pour l'exécuter.Il est possible que votre argument de ligne de commande de manipulation dans le shell script n'est pas de faire ce que vous voulez qu'il fasse.

Je ne sais pas ce que votre entrée pour le script devrait être, mais le $1 avant le chemin semble un peu hors de place pour moi.

Êtes-vous sûr que vous voulez faire

/usr/bin/mono $1/hooks/post-commit.exe "$@"

$@ étend à TOUS les arguments."$@" s'étend à tous les arguments rejoindre par des espaces.Je soupçonne que vous script shell est incorrect.Vous n'avez pas préciser exactement ce que vous vouliez dans le script, de sorte que la limite de nos possibilités de faire des suggestions.

Comparer les variables d'environnement dans votre coquille et à partir du script.

Essayez de mettre des "cd $1/hooks/" avant la ligne qui passe en mono.Vous avez peut-être assemblées dans ce dossier que l'on trouve lorsque vous exécutez mono à partir de ce dossier dans le shell, mais ne sont pas disponibles lorsque vous exécutez votre script.

Après avoir vérifié que mon code n' travailler à partir de la ligne de commande, j'ai trouvé qu'il n'était plus de travail!Je suis allé regarder dans mes .net code pour voir si quelque chose a du sens.

Voici ce que j'ai eu:

        static public int Execute(string sCMD, string sParams, string sComment,
                                  string sUserPwd, SVNCallback callback)
        {
            System.Diagnostics.Process proc = new System.Diagnostics.Process();
            proc.EnableRaisingEvents = false;
            proc.StartInfo.RedirectStandardOutput = true;
            proc.StartInfo.CreateNoWindow = true;
            proc.StartInfo.UseShellExecute = false;
            proc.StartInfo.Verb = "open";
            proc.StartInfo.FileName = "svn";
            proc.StartInfo.Arguments = Cmd(sCMD, sParams, sComment, UserPass());
            proc.Start();
            int nLine = 0;
            string sLine = "";
            while ((sLine = proc.StandardOutput.ReadLine()) != null)
            {
                ++nLine;
                if (callback != null)
                {
                    callback.Invoke(nLine, sLine);
                }
            }
            int errorCode = proc.ExitCode;
            proc.Close();
            return errorCode;
        }

J'ai changé ce:

            while (!proc.HasExited)
            {
                sLine = proc.StandardOutput.ReadLine();
                if (sLine != null)
                {
                    ++nLine;
                    if (callback != null)
                    {
                        callback.Invoke(nLine, sLine);
                    }
                }
            }
            int errorCode = proc.ExitCode;

Il semble que le Processus est de traîner un peu plus longtemps que je suis sortie, et donc la proc.ExitCode est de lancer une erreur.

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top