WSH / JScript根据时间启动和停止服务?

时间:2010-10-14 13:05:12

标签: service scheduled-tasks wsh jscript

只是想看看我的评估在最简单的方法上是否正确。

背景:我们有一个软件套件,我们通过服务运行。这些服务需要在晚上10点到早上6点之间关闭。我们还需要每隔10分钟检查一次服务,以防它们在应该启动时停机,以防我们在需要关闭的时候重新启动。

选择:我正在考虑一个每10分钟运行一次WSH / JScript的计划任务。 JScript的pseduo代码类似于:

  • 获取当前时间
  • 如果当前时间是晚上10点之后但是早上6点之前
    • 调用EnsureDowntime()
  • 否则
    • 调用EnsureUptime()
  • EnsureDownime():
    • 如果服务正在运行,请将其停止
  • EnsureUptime():
    • 如果服务未运行,请启动它们

问题

  • 计划任务/ WSH / JScript是执行此操作的最佳方式,还是至少可接受的方式?
  • 正在调用一个新的Date()并使用.getHours()找到时间的最佳原因?
  • 我的伪代码看起来是最好的方法吗?
  • 如何检测服务状态(运行/不运行)?
    • 或者在这种情况下,我应该只是开始/停止服务而不管状态如何?如果没有错误并且它不会重新启动已经启动的服务,我想我可以使用“net start”和“net stop”。

预先感谢您提供任何帮助!

2 个答案:

答案 0 :(得分: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。
  • 中显示的完整服务名称

如果您对我如何改进代码有任何问题或意见,请与我们联系!

谢谢,

- 肖恩

答案 1 :(得分:0)

你提到过:

  

...(直接指向.js无效,我发现了)

在尝试从Windows 2003中的任务计划程序运行WSH JS文件时,我遇到了这种情况。我在WIn7中发现,只需引用.js文件就可以直接运行它,但它如果在2003 Scheduler中以相同的方式运行,则至少无法将参数传递给脚本。

我确实找到了一种似乎可以避免需要您提到的存根批处理文件的解决方法:如果您只是在.js文件前加上'WScript'(或'CScript') - 则不需要完整路径因为它们在%WINDIR%\ system32中,所以它似乎对我有用,包括.js文件获取任何参数传递。