Проблема с приложением .net под Linux, не работает из сценария оболочки - PullRequest
1 голос
/ 10 сентября 2008

Я работаю над ловушкой .net post-commit для подачи данных в OnTime через их Soap SDK. Мой хук хорошо работает в Windows, но на нашем производственном сервере подрывной работы RHEL4 он не будет работать при вызове из сценария оболочки.

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

Когда я выполняю его с параметрами из командной строки, он работает правильно. При выполнении через сценарий оболочки я получаю следующую ошибку: (похоже, что есть проблема с выполнением процесса SVN, который я использую для получения данных журнала для ревизии):


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]

Я пытался использовать mkbundle и mkbundle2, чтобы создать отдельное приложение с именем post-commit, но я получаю другое сообщение об ошибке:

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]

Есть идеи, почему он может не работать из скрипта оболочки или что может быть не так в комплектной версии?

Редактировать: @ Herms , я уже пробовал это с эхом, и это выглядит правильно. Что касается $1/hooks/post-commit.exe, я пробовал скрипт с полным путем и без полного пути к сборке .net с теми же результатами.

Редактировать: @ Леон , я пробовал оба $1 $2 и "$@" с одинаковыми результатами. Это ловушка пост-фиксации subversion, и она принимает два параметра, поэтому они должны быть переданы в сборку .net. "$@" было то, что было рекомендовано на моно-сайте для вызова сборки .net из сценария оболочки. Сценарий оболочки - это , выполняющий сборку .net с правильными параметрами, но он вызывает исключение, которое не выдается при запуске непосредственно из командной строки.

Редактировать: @ Винко , я не вижу никаких отличий в окружающей среде, кроме таких вещей, как BASH_LINENO и BASH_SOURCE

Редактировать: @ Люк , я устал, но это тоже не имеет значения. Я впервые заметил проблему при тестировании с TortoiseSVN на моем компьютере (когда он работает как подпроцесс демона subversion), но также обнаружил, что я получаю те же результаты при выполнении скрипта из каталога hooks (то есть ./post-commit REPOS REV, где post-commit - приведенный выше скрипт sh. Выполнение mono post-commit.exe REPOS REV работает нормально. Основная проблема заключается в том, что для выполнения мне нужно иметь что-то с именем post-commit, чтобы оно вызывалось. Но оно не работает из сценарий оболочки, и, как отмечено выше, mkbundle не работает с другой проблемой.

Ответы [ 6 ]

2 голосов
/ 15 сентября 2008

Обычно некоторые процессы задерживаются на некоторое время после того, как они закрывают свой стандартный вывод (т. Е. Вы получаете чтение конца файла). Вам нужно позвонить proc.WaitForExit() после чтения всех данных, но перед проверкой ExitCode.

0 голосов
/ 10 сентября 2008

Убедившись, что мой код работал из командной строки, я обнаружил, что он больше не работает! Я заглянул в свой код .net, чтобы понять, имеет ли что-нибудь смысл.

Вот что у меня было:

        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;
        }

Я изменил это:

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

Похоже, что процесс зависает немного дольше, чем я получаю вывод, и поэтому proc.ExitCode выдает ошибку.

0 голосов
/ 10 сентября 2008

Попробуйте поставить "cd $ 1 / hooks /" перед строкой, которая запускает моно. В этой папке могут быть некоторые сборки, которые обнаруживаются при запуске mono из этой папки в оболочке, но не обнаруживаются при запуске сценария.

0 голосов
/ 10 сентября 2008

Сравните переменные окружения в вашей оболочке и внутри скрипта.

0 голосов
/ 10 сентября 2008

Вы уверены, что хотите сделать

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

$ @ распространяется на ВСЕ аргументы. «$ @» распространяется на все аргументы, объединяемые пробелами. Я подозреваю, что сценарий оболочки неверен. Вы не указали, что именно вы хотите, чтобы скрипт делал, поэтому это ограничивает наши возможности вносить предложения.

0 голосов
/ 10 сентября 2008

Просто случайная мысль, которая может помочь с отладкой. Попробуйте изменить свой сценарий оболочки на:

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

Проверьте и посмотрите, соответствует ли строка, которую она печатает, команде, которую вы ожидаете запустить. Возможно, ваша обработка аргументов командной строки в сценарии оболочки не выполняет то, что вы хотите.

Я не знаю, какой будет ваш ввод в сценарий, но $ 1 перед путем выглядит для меня немного неуместно.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...