我需要正常关闭在RoleEntryPoint.OnStop()
方法中以System.Diagnostics.Process
开头的mongod.exe。Howto在`RoleEntryPoint.OnStop()`方法中正常关闭mongod
我受到文章Running MongoDb on Microsoft Windows Azure with 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();
}
我是如何意识到父进程保持锁定的?我只是将进程更改为在新shell窗口中运行,其中没有输出被重定向(startInfo.UseShellExecute = true
)。两个控制台窗口启动,当mongod关闭时,它在主应用程序终止之前释放锁定。我需要在Windows Azure的RoleEntryPoint
中使用它。
有谁知道如何?
编辑:
我意识到,也许它的父进程,具有听众ErrorDataReceived
和OutputDataReceived
持有的mongod输出流的正确关闭/潮红mongod.lock ......地方呢?
看来,这将是我的问题的解决方案,但它不是一个答案。我读了日志选项将成为未来版本的默认选项,所以我认为我不需要担心这个,是吗?我希望4倍写入单个插入不会杀死我的CloudDrive。 – 2011-06-11 01:30:15
即使认为日记功能现在不是默认设置,您仍然可以使用它。将--journal与--dbpath一起添加到您的进程参数中。希望有所帮助。 – Sridhar 2011-06-11 02:29:56
感谢您添加关机命令,确切地说应该是什么(除了驱动程序挂起的问题,我将使用来自Github的固定问题)。我将启用日记功能以确保并尝试监控性能。 – 2011-06-11 10:38:34