C# VBScript アプリケーション開発

【C#】【VBScript】アプリケーションの自動再起動

投稿日:

このページの内容

この機能を作成した理由

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);
}

この機能を組み込むことによって、システム担当者の夜中対応がちょっとでも削減されるなら本望です。

Follow me!

-C#, VBScript, アプリケーション開発
-,

執筆者:


comment

メールアドレスが公開されることはありません。

関連記事

GASの利用 ~Webアプリでスプレッドシートの値を表示する~

このページの内容 スプレッドシートの値の読み込みと書き込み実際にやってみる初回実行時のみ必要になる作業について実行した結果このアプリを修正していく場合 スプレッドシートの値の読み込みと書き込み GAS …

GASの利用 ~新しい生活様式のためのメモ①~

コロナウィルスの拡大により、政府から“「新しい生活様式」の実践例”というものが、公開されていることをご存知の方も多いと思います。その中で、“移動に関する感染対策”という項目の中で、“発症したときのため …

GASの利用 ~Webアプリの開発をやってみる~

このページでは、Google Apps Scriptを利用してサーバーレスでWebアプリを開発するための初期段階として、Webブラウザで”Hello GAS”と表示させるまでの …

GASの利用 ~スプレッドシートの値が取得できない or 想定と異なる場合~

getValuesでスプレッドシートの値を取得しようとした際に、・値が取得できない・取得した値が想定していたものと違うという状況に遭遇した場合について、このページでは記載しています。 ※このページの …

VisualStudio2019でSQLiteを利用する(NuGetパッケージのインストール)

このページでは、VisualStudio2019にてNuGetパッケージのインストールによってSQLiteを利用するための手順を紹介しています。DLLをダウンロードして、参照設定にて利用される方法はこ …

このサイトの管理者について

1980年代生まれ
石川県在住

メーカー2社経験後に退社

1年程度自由に在職中はできなかったことにチャレンジ

その後コロナの影響でなかなか仕事が見つかりませんでしたが、無事就職

現在はシステム会社に勤務中

PAGE TOP