我需要正常關閉在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