このページの内容
24H稼働している工場等のクラサバ系のシステムで、サーバー側ソフトが原因不明のハングアップをしてしまい、夜中に呼び出しを受けてしまったという経験があるシステム担当者は少なからずいるかと思います。
※私の場合は時折夜中に呼び出されて、原因を探っていたらサーバー側のソフトがハングアップしてしまっており、アプリケーションの再起動だけで解決したということが何度かありました(泣)
そんなハングアップ時に自動で、アプリケーションの強制終了 → 再起動 を実現する機能を作成してみました。
exeと同一フォルダに、強制再起動するVBScriptを作成して実行させます。
どこに組み込むのかは、開発者の皆様にお任せいたします。
※この処理の直前に再起動が実行した旨を知らせるメール処理等を追加すると、再起動の事実に気付けるので、さらなる調査などが出来ると思います。
/// <summary>
/// VBScriptを利用して、プロセスを強制的に再起動します。
/// </summary>
private void ForceRestart()
{
string exePath = System.Reflection.Assembly.GetEntryAssembly().Location; //自己プロセスのexeのフルパスを取得
string processName = System.IO.Path.GetFileName(exePath); //exe名を取得
string scriptPath = System.IO.Path.GetDirectoryName(exePath) + @"\ForceRestart.vbs";
//再起動用のVBScriptファイルが存在する場合は、削除しておく
//削除せずにファイルが存在する場合はもちろんそのまま実行してもよいです
if (System.IO.File.Exists(scriptPath))
System.IO.File.Delete(scriptPath);
System.IO.StreamWriter stWriter;
string vbScript; //実行するscriptを用意する
vbScript = "Option Explicit" + Environment.NewLine;
vbScript += "On Error Resume Next" + Environment.NewLine; //エラーが発生しても処理を継続する
vbScript += "Dim procName" + Environment.NewLine; //強制終了させるプロセス名
vbScript += "Dim procList" + Environment.NewLine; //全プロセスを読み込ませる
vbScript += "Dim proc" + Environment.NewLine; //個別のプロセス
vbScript += "Dim wShell" + Environment.NewLine; //exeを再起動させる
vbScript += "procName=\"" + processName + "\"" + Environment.NewLine; //終了させるプロセスとして、自己exeを指定する
vbScript += "Set procList=GetObject(\"winmgmts:\").InstancesOf(\"win32_process\")" + Environment.NewLine; //win32のプロセスを取得する
vbScript += "For Each proc In procList" + Environment.NewLine;
vbScript += " If proc.Name=procName Then" + Environment.NewLine;
vbScript += " proc.Terminate" + Environment.NewLine; //終了処理
vbScript += " End If" + Environment.NewLine;
vbScript += "Next" +Environment.NewLine;
vbScript += "Set procList=Nothing" + Environment.NewLine;
vbScript += "WScript.Sleep 3000" + Environment.NewLine; //念のため3sec待機させてからプロセスを起動する
//ここからexeの起動処理
vbScript += "Set wShell=CreateObject(\"WScript.Shell\")" + Environment.NewLine;
vbScript += "wShell.Run \"" + exePath + "\"" + Environment.NewLine;
vbScript += "Set wShell=Nothing";
//VBScriptを書き込む
//Encodingを指定しないと、UTF-8で書き込むが、UTF-8ではVBScriptが動かないので、SJISを指定
stWriter = new System.IO.StreamWriter(scriptPath, false, Encoding.GetEncoding("Shift_JIS")); stWriter.Write(vbScript);
stWriter.Close();
//強制再起動のVBScriptを実行する
System.Diagnostics.Process.Start(scriptPath);
}
この機能を組み込むことによって、システム担当者の夜中対応がちょっとでも削減されるなら本望です。