Процесс, созданный Process.Start (), завершается при закрытии родительского приложения. - PullRequest
3 голосов
/ 20 декабря 2011

Я использую C # и Mono 2.10.2 в Debian 6.

Таким образом, сценарий состоит в том, что я создал процесс с помощью Process.Start (), как показано ниже:

Process p = new Process();

p.StartInfo.UseShellExecute = false;
p.StartInfo.RedirectStandardOutput = true;
p.StartInfo.RedirectStandardInput = true;
p.StartInfo.RedirectStandardError = true;
p.StartInfo.WorkingDirectory = "/home/lucy/";
p.StartInfo.FileName = "/bin/sh";
p.StartInfo.Arguments = "/home/lucy/test.sh";

p.EnableRaisingEvents = true;
p.ErrorDataReceived += new DataReceivedEventHandler(ShellProc_ErrorDataReceived);

p.Start();

Сценарий оболочки, который в этом случае называется test.sh, запускается и выполняет несколько функций, включая запуск Java-приложения.Проблема, которую я получаю, заключается в том, что, когда приложение c # завершается, приложение bash script / java также завершает свою работу.

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

Как создать Процесс, который переживает своего родителя

По мнению некоторых пользователей и предположительно документов, процессы, созданные Process.Start (), не должны быть прекращеныкогда приложение завершается, но, очевидно, в моем случае это не так.Так может ли это быть проблемой, связанной с Mono, и если это действительно так, то есть ли альтернатива тому, как я это делаю сейчас, когда у меня нет идей?

Ответы [ 2 ]

2 голосов
/ 20 декабря 2011

Вот полный пример, который работает для меня:

using System;
using System.Diagnostics;

class Tick {
  static void Main(string[] args) {  
    Process p = new Process();

    p.StartInfo.UseShellExecute = false;
    p.StartInfo.RedirectStandardOutput = false;
    p.StartInfo.RedirectStandardInput = true;
    p.StartInfo.RedirectStandardError = true;
    p.StartInfo.WorkingDirectory = Environment.CurrentDirectory;
    p.StartInfo.FileName = "/bin/sh";
    p.StartInfo.Arguments = "test.sh";

    p.EnableRaisingEvents = true;
    p.ErrorDataReceived += new DataReceivedEventHandle(ShellProc_ErrorDataReceived);

    p.Start();
    System.Threading.Thread.Sleep (5000);
    Console.WriteLine ("done");
  }  
  static void ShellProc_ErrorDataReceived (object sender, DataReceivedEventArgs ea)
  {
  }
}

, а затем test.sh:

while true; do
    date;
    sleep 1;
done

Когда я запускаю образец из терминала, скрипт test.sh продолжит выводить данные после выхода из программы примера.

1 голос
/ 22 декабря 2011

Обновление 1 / Решение: Это на самом деле не ошибка моно, а моя собственная ошибка. Ответ ниже помог мне прийти к выводу, что в моем приложении что-то другое вызывало запуск процессов по завершению приложения, когда приложение завершается, и фактическая причина, которая вызывала это, была некоторыми вещами GC, в частности, GC.Collect (), моя вина, извините, и я надеюсь, что это поможет всем, у кого есть подобная проблема.

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