Проблема перенаправления как стандартной ошибки, так и стандартного ввода при запуске процесса - PullRequest
0 голосов
/ 10 мая 2011

У меня есть некоторый код на c #, который запускает процесс Java. На одной машине под управлением Windows 7 все работает нормально. На другой запущенной XP это не так. Вот код ...

mServerProcess = new Process();
mServerProcess.StartInfo.FileName = "java";
mServerProcess.StartInfo.Arguments = "-jar my.jar";
mServerProcess.StartInfo.WorkingDirectory = "C:\\my_server";
mServerProcess.StartInfo.UseShellExecute = false;
mServerProcess.StartInfo.CreateNoWindow = true;
mServerProcess.StartInfo.RedirectStandardOutput = true;
mServerProcess.StartInfo.RedirectStandardError = true;
mServerProcess.StartInfo.RedirectStandardInput = true;
mServerProcess.OutputDataReceived += new DataReceivedEventHandler(ServerOutputHandler);
mServerProcess.ErrorDataReceived += new DataReceivedEventHandler(ServerErrorHandler);
mServerProcess.SynchronizingObject = this.console;

// Start the process.
mServerProcess.Start();

// Start the asynchronous read of the sort output stream.
mServerProcess.BeginOutputReadLine();
mServerProcess.BeginErrorReadLine();

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

Теперь ... интересно, если я закомментирую код, который перенаправляет стандартный ввод, я действительно получаю стандартную ошибку. Но, конечно, мне нужно перенаправить стандартный ввод.

Кто-нибудь видел это раньше? ... где перенаправление как стандартного ввода, так и стандартной ошибки вызывает проблему?

И снова ... У меня нет этой проблемы на моем компьютере с Windows 7.

Спасибо, Гул

UPDATE:

Я использую класс java Logger для вывода информации из моего приложения java. Я думаю, что эта проблема связана именно с Java, и как класс ConsoleHandler работает со стандартной ошибкой. Это сводит меня с ума!

Ответы [ 3 ]

1 голос
/ 10 мая 2011

Процесс, вероятно, ожидает некоторого ввода.

Попробуйте дать ему немного информации.

0 голосов
/ 03 декабря 2014

Вы вызываете процесс Java, который использует Jline? Если это так, то вам нужно вызвать его с помощью следующего параметра:

-Djline.terminal=jline.UnsupportedTerminal
0 голосов
/ 10 мая 2011

Если вы перенаправите вход и выход, вы можете заблокировать ввод / вывод. В зависимости от буферизации это может вести себя по-разному в разных операционных системах или с разными входами и выходами. Например, может показаться, что он работает нормально при вводе 1 Кб, но зависает при 4 Кб. Смотрите документацию и ищите тупик:

...