2

これを行う最も簡単な方法で私の評価が正しいかどうかを確認するだけです。

背景:サービスを介して実行しているソフトウェアスイートがあります。サービスは午後10時から午前6時の間にシャットダウンする必要があります。また、サービスが稼働しているはずのときにサービスがダウンした場合や、シャットダウンが必要なときにサービスを再起動した場合に備えて、サービスを回復するために10分ごとにチェックする必要があります。

選択肢:10分ごとにWSH/JScriptを実行するスケジュールされたタスクを考えています。JScriptのpseduoコードは次のようになります。

  • 現在の時刻を取得する
  • 現在の時刻が午後10時以降、午前6時前の場合
    • PreventDowntime()を呼び出す
  • そうしないと
    • PreventUptime()を呼び出す
  • PreventDownime():
    • サービスが実行されている場合は、停止します
  • PreventUptime():
    • サービスが実行されていない場合は、サービスを開始します

質問

  • スケジュールされたタスク/WSH/ JScriptはこれを行うための最良の方法ですか、それとも少なくとも許容できる方法ですか?
  • 新しいDate()を呼び出し、.getHours()を使用するのが、時間を見つける最良の理由ですか?
  • 私の擬似コードはこれにアプローチするための最良の方法のように見えますか?
  • サービスの状態(実行中/非実行中)を検出するにはどうすればよいですか?
    • またはこの場合、状態に関係なくサービスを開始/停止する必要がありますか?エラーがなく、すでに開始されているサービスが再開されない場合は、「netstart」と「netstop」を使用するだけでよいと思います。

あなたが与えることができるどんな助けにも前もって感謝します!

4

2 に答える 2

1

理解した!

ソリューションのチュートリアル

  • まず、スケジュールされたタスクを作成し、それを .bat ファイルにポイントします (.js に直接ポイントしても機能しないことがわかりました)。
  • バッチ ファイルで、.js ファイルを指定して実行します (たとえば、私のファイルは "D:\BF_Ping.js" にありました)。

BF_Ping.bat :

D:
cd\
BF_Ping.js
  • 次に、JavaScript ファイルを作成します。参考までに、私の完全にコメントしたファイルを以下に示します。

BF_Ping.js:

//*** Time Variables ***//
var UptimeBeginsAtHour = 6;     // Hour at which the services should be started
var UptimeEndsAtHour = 22;      // Hour at which the services should be ended

//*** Flags ***//
var KILL_FLAG = FindFile("C:\\BF_KILL.txt"); // If this flag is true, services will be shut down and not started.
var LAZY_FLAG = FindFile("C:\\BF_LAZY.txt"); // If this flag is true, nothing in the script will run.

if (KILL_FLAG == true)
{
    StopBizFlowServices();
}

if (KILL_FLAG == false && LAZY_FLAG == false)
{
    DetectTimeAndProcess(UptimeBeginsAtHour, UptimeEndsAtHour);
}

/***
 * DetectTimeAndProcess(startAtHour, stopAtHour):
 * Starts or stops BizFlow Services based on uptime variables.
 * 
 * ---Arguments---
 * startAtHour  Hour after which services should be started (defined by variable in main code)
 * stopAtHour   Hour after which services should be started (defined by variable in main code)
 * 
 * ---Returns---
 * None (void)
 * 
 * ---Called By---
 * Main code.
 */

function DetectTimeAndProcess(startAtHour, stopAtHour)
{
    var currentTime = new Date();   
    var hour = currentTime.getHours();      // Returns Hour in 24-hour format

    if (hour > startAtHour && hour < stopAtHour)
    {
        StartBizFlowServices();
    }
    else
    {
        StopBizFlowServices();
    }
}

/***
 * StartBizFlowServices():
 * Starts BizFlow Services using "net start" and the service name.
 * 
 * --- Arguments ---
 * None.
 * 
 * --- Returns ---
 * None (void)
 * 
 * --- Called By---
 * DetectTimeAndProcess()
 */
function StartBizFlowServices()
{
    var objShell = WScript.CreateObject("WScript.Shell");

    objShell.Run("net start \"BizFlow Database Service\" ", 1, true);
    objShell.Run("net start \"BizFlow Main Service\"", 1, true);
    objShell.Run("net start \"BizFlow OLE-DB Service\"", 1, true);
    objShell.Run("net start \"BizFlow PKI Service\"", 1, true);
    objShell.Run("net start \"BizFlow Queue Service\"", 1, true);
    objShell.Run("net start \"BizFlow Scheduler Service\"", 1, true);
}

/***
 * StopBizFlowServices():
 * Stops BizFlow Services using "net stop" and the service name.
 * 
 * --- Arguments ---
 * None.
 * 
 * --- Returns ---
 * None (void)
 * 
 * --- Called By---
 * DetectTimeAndProcess()
 */
function StopBizFlowServices()
{
    var objShell = WScript.CreateObject("WScript.Shell");

    objShell.Run("net stop \"BizFlow OLE-DB Service\"", 1, true);
    objShell.Run("net stop \"BizFlow PKI Service\"", 1, true);
    objShell.Run("net stop \"BizFlow Queue Service\"", 1, true);
    objShell.Run("net stop \"BizFlow Scheduler Service\"", 1, true);
    objShell.Run("net stop \"BizFlow Main Service\"", 1, true);
    objShell.Run("net stop \"BizFlow Database Service\"", 1, true);

}

/***
 *
 * FindFile (filePath):
 * Searches for the existence of a given file path.
 * 
 * --- Arguments ---
 * filePath     Full Path of file (including file name)
 * 
 * --- Returns ---
 * true     if file is found
 * false    if file is not found
 * 
 * --- Called By---
 * Main Code (while setting flags)
 */

function FindFile(filePath)
{

    var fso;  //For FileSystemObject
    fso = new ActiveXObject("Scripting.FileSystemObject");

    if(fso.FileExists(filePath))
    {
        return true;
    }
    else
    {
        return false;
    }
}

私は実際にこれを少し誇りに思っています-最初はエラーなしで実行されました:)

いくつかのメモ:

  • 時刻は 24 時間形式で表示されます。
  • チェックが頻繁に実行されるように、スケジュールされたタスクを 5 ~ 10 分ごとに実行するように設定します。
  • ここで使用するサービスは、クライアントが使用している製品である BizFlow サービスです。もちろん、それに応じて関数の名前を変更できます。
  • サービス名に対して「net start」または「net stop」を実行するときは、引用符のエスケープ文字に注意してください。
  • services.msc に表示される完全なサービス名を使用します。

コードを改善する方法について質問やコメントがあればお知らせください。

ありがとう、

-- ショーン

于 2010-10-22T12:50:06.570 に答える
0

あなたは次のように述べました:

... (.js を直接指定しても機能しないことがわかりました)

これは、Windows 2003 でタスク スケジューラから WSH JS ファイルを実行しようとしたときにも遭遇したものでした。WIN7 では、.js ファイルへの参照だけで直接実行できることがわかりましたが、パスに失敗しました。 2003 Scheduler で同じ方法で実行する場合、少なくともスクリプトにパラメーターを追加します。

ただし、あなたが言及したスタブ バッチ ファイルを必要としないように機能するように思われる回避策を見つけました。 %WINDIR%\system32 で、渡されたパラメーターを取得する .js ファイルを含めて、私にとってはうまくいくようです。

于 2013-08-23T19:35:12.797 に答える