Мне нужно изящно завершить работу mongod.exe, который запускается методом System.Diagnostics.Process
в RoleEntryPoint.OnStop()
.
Меня вдохновила статья Запуск MongoDb в Microsoft Windows Azure с CloudDrive .
Кажется, все работает нормально, однако после перезапуска WorkerRole mongod говорит:
**************
old lock file: .\mongod.lock. probably means unclean shutdown
recommend removing file and running --repair
see: http://dochub.mongodb.org/core/repair for more information
*************
Итак, я создал простое Консольное приложение , код ниже и смоделировал тот же результат, когда mongod.exe убит. Файл блокировки снимается только тогда, когда окно консоли (родительский процесс) закрыто. Поскольку CloudDrive отключен раньше, чем родительский процесс завершен (RoleEntryPoint
), файл mongod.lock никогда не выпускается в среде Windows Azure WorkerRole.
static void Main(string[] args)
{
StartMongo();
Console.ReadLine();
_mongoProcess.Close();
}
private static void StartMongo()
{
_mongoProcess = new Process();
var startInfo = _mongoProcess.StartInfo;
startInfo.UseShellExecute = false;
startInfo.CreateNoWindow = false;
startInfo.FileName = @"mongod.exe";
startInfo.WorkingDirectory = Environment.CurrentDirectory;
startInfo.Arguments = "--dbpath .";
startInfo.RedirectStandardError = true;
startInfo.RedirectStandardOutput = true;
_mongoProcess.ErrorDataReceived += (sender, evt) => WriteLine(evt.Data);
_mongoProcess.OutputDataReceived += (sender, evt) => WriteLine(evt.Data);
_mongoProcess.Start();
_mongoProcess.BeginErrorReadLine();
_mongoProcess.BeginOutputReadLine();
}
Как я понял, что родительский процесс удерживает блокировку? Я просто изменил процесс для запуска в новом окне оболочки, где не было перенаправлено вывода (startInfo.UseShellExecute = true
). Запустились два окна консоли, и когда mongod был закрыт, он снял блокировку до того, как основное приложение было прекращено . Мне нужно добиться такого поведения, чтобы использовать его в RoleEntryPoint
в Windows Azure.
Кто-нибудь знает как?
EDIT:
Я понял, что, возможно, это родительский процесс, у которого есть слушатели ErrorDataReceived
и OutputDataReceived
, которые поддерживают правильное закрытие / сброс потока вывода mongod в mongod.lock ... это может быть?