У меня клиент-серверное приложение, разработанное на C # .NET 3.5. Это приложение использует 3 программы для выполнения необходимой работы. Процесс A (сервер) и процесс B (удаленный запуск) разработаны в .NET, а процесс C - это стороннее консольное приложение, язык разработки которого неизвестен. Используя административные учетные данные удаленного компьютера, процесс A копирует на него процесс B и планирует процесс B как задачу на удаленном компьютере. После этого процесс B запускается планировщиком задач и создает файл log.txt
для регистрации сообщений. Затем Процесс B запускает Процесс C, используя семантику Process.Start()
, и перенаправляет его standard output and error
для записи в файл log.txt
. Процесс A использует семантику Process.GetProcesses(remotecomputername)
, чтобы отслеживать, работает ли еще процесс C на удаленном компьютере.
Процесс A также читает файл log.txt
, используя сетевой ресурс, читаемый как \\RemoteComputerName\C$\RemoteDir\log.txt
, и отображает сообщения в своем окне.
Моя проблема в том, что все выходные данные и сообщения об ошибках не регистрируются log.txt
. И Процесс A не может правильно читать из log.txt
. Если выходные данные / ошибки регистрируются с помощью DebugView, они регистрируются правильно. Является ли это проблемой синхронизации / прав доступа? Как от этого избавиться?
Любые указатели / подсказки будут действительно ценными. Невозможно предоставить полный код из-за ограничений.
Пример кода приведен ниже
Процесс A
//Below method is called every 2 seconds from Server to read new messages.
//path passed as `\\RemoteComputerName\C$\RemoteDir\log.txt`
private void ReadRemoteLog(string path)
{
try
{
string[] lines = File.ReadAllLines(path);
while (RemoteLogPosition < lines.LongLength)
{
string msg = lines[RemoteLogPosition].Trim();
if (!string.IsNullOrEmpty(msg))
{
Trace.WriteLine("# " +msg); //Writing on DebugView
OnProgressChanged(msg);
}
RemoteLogPosition++; //This is global variable to keep track of last read position.
}
}
}
Код процесса B для запуска процесса C
ProcessStartInfo ps = new ProcessStartInfo();
ps.UseShellExecute = false;
ps.FileName = <Path to process C>;
ps.Arguments = <Commandline args to Process C>;
ps.WorkingDirectory = @"C:\RemoteDir";
ps.RedirectStandardError = true;
ps.RedirectStandardOutput = true;
Process p = new Process();
p.StartInfo = ps;
p.OutputDataReceived += (s, e) => { WriteLog(e.Data.Trim());};
p.ErrorDataReceived += (s, e) => { WriteLog(e.Data.Trim()); };
p.Start();
p.BeginOutputReadLine();
p.BeginErrorReadLine();
WriteLog("Process Started - "+ps.FileName + ps.Arguments);
p.WaitForExit();
Метод WriteLog процесса B -
private void WriteLog(string message)
{
using (FileStream fs = new FileStream(@"C:\\RemoteDir\log.txt", FileMode.OpenOrCreate, FileAccess.Write, FileShare.Inheritable))
using(StreamWriter sw = new StreamWriter(fs))
{
sw.WriteLine("#" + message);
}
}