2015-07-21 6 views
0

Я ищу, чтобы выполнить процесс в Mono (C#) в ящике Linux, но мне нужно, чтобы он продолжал работать после выхода моего .exe. Я пытаюсь использовать nohup для этого, но до сих пор не имел никакого успеха. Это мой код прямо сейчас:Как выполнить процесс в моно с nohup?

void Execute(string command, string commandPath, string arguments, bool nohup = false) 
{ 
    ProcessStartInfo startInfo = new ProcessStartInfo() 
         { 
          FileName = nohup ? "sh" : Path.Combine(commandPath, script), 
          Arguments = nohup ? "nohup " + Path.Combine(commandPath, script) + " " + arguments + " &" : arguments, 
          UseShellExecute = false, 
          CreateNoWindow = true, 
          RedirectStandardOutput = true, 
          RedirectStandardError = true, 
          RedirectStandardInput = true, 
          UserName = System.Environment.UserName 
         }; 

     using (Process process = Process.Start(startInfo)) 
         { // Monitor for exit} 
} 

Так я проверяю параметр поЬира и если это правда, я исполняю оболочку и отправить полную команду (например: nohup /path/to/my/command <args> &). Я получаю сообщение об ошибке /path/to/my/command cannot execute binary file.

Другая вещь, о которой я подумал, - это открытие процесса sh, а затем отправка полной команды nohup в стандартный ввод, но для этого мне пришлось бы реорганизовать совсем немного кода, поэтому, если есть способ делать то, что я хочу без этого, я бы пошел по этому пути.

Итак ... Каков наилучший способ выполнения процесса на C# в среде Linux (Mono), который использует nohup, чтобы оставаться в живых после того, как родительский процесс умер?

ответ

0

Я получаю сообщение об ошибке, которое говорит/path/to/my/command не может выполнить двоичный файл .

В этом случае, я бы изменить CreateNoWindow к истинному, не перенаправлять IO и посмотреть, что вы получаете в созданной оболочке для того, чтобы отладить, что ...

Что касается создания фона процесс, один из способов - создать демон и иметь способ читать/записывать в него информацию (сетевой порт, журналы файлов и т. д.), но просто запускать фоновую задачу, как вы пытаетесь работать нормально.

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

using System; 
using System.Runtime.InteropServices; 
using System.Diagnostics; 
using System.IO; 
using System.Threading; 

    namespace nohub.process.exec 
    { 
     class MainClass 
     { 

      [DllImport ("libc")] 
      private static extern int system (string exec); 

      private static string logfile = Path.GetTempFileName(); 

      static void Execute (string command, string commandPath, string arguments, bool nohup = false) 
      { 
       if (!nohup) { 
        var startInfo = new ProcessStartInfo() { 
         FileName = Path.Combine (commandPath, command), 
         Arguments = arguments, 
         UseShellExecute = false, 
         CreateNoWindow = true, 
         RedirectStandardOutput = true, 
         RedirectStandardError = true, 
         RedirectStandardInput = true, 
         UserName = System.Environment.UserName 
        }; 

        using (Process process = Process.Start (startInfo)) { // Monitor for exit} 
         process.WaitForExit(); 
         using (var output = process.StandardOutput) { 
          Console.Write ("Results: {0}", output.ReadLine()); 
         } 
        } 
       } else { 
        system ("nohup " + Path.Combine (commandPath, command) + " " + arguments + " 2>&1 > " + logfile + " & "); 
       } 

      } 

      public static void Main (string[] args) 
      { 
       Console.WriteLine ("Hello Stack Overflow"); 
       Console.WriteLine ("Temp file: {0}", logfile); 
       Execute ("find", "", "/", true); 
       Thread.Sleep (1000); 
       Execute ("wc", "", "-l " + logfile, false); 
       Console.Write ("\nLet find continue? [y/n]"); 
       if ((Console.ReadKey (false)).KeyChar == 'y') 
        system ("killall find"); 
      } 
     } 
    } 

 Смежные вопросы

  • Нет связанных вопросов^_^