2

只是想看看我的评估是否以最简单的方式正确。

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

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

  • 获取当前时间
  • 如果当前时间在晚上 10 点之后但在早上 6 点之前
    • 调用 EnsureDowntime()
  • 别的
    • 调用 EnsureUptime()
  • 确保停机时间():
    • 如果服务正在运行,请停止它们
  • 确保正常运行时间():
    • 如果服务未运行,请启动它们

问题

  • 计划任务/WSH/JScript 是做到这一点的最佳方式,还是至少是可接受的方式?
  • 调用 new Date() 并使用 .getHours() 是最好的为什么要找到时间?
  • 我的伪代码看起来是解决这个问题的最佳方法吗?
  • 如何检测服务的状态(运行/非运行)?
    • 或者在这种情况下,无论状态如何,我都应该启动/停止服务吗?如果没有错误并且它不会重新启动已经启动的服务,我想我可以使用“net start”和“net stop”。

提前感谢您提供的任何帮助!

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 调度程序中以相同的方式运行,则至少为脚本提供参数。

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

于 2013-08-23T19:35:12.797 回答