WSH/JScript для запуска и остановки служб в зависимости от времени?

Просто смотрю, верна ли моя оценка самого простого способа сделать это.

Общие сведения: у нас есть программный пакет, который мы запускаем через сервисы. Услуги должны быть закрыты с 22:00 до 6:00. Нам также нужно проверять каждые 10 минут, чтобы восстановить службы, если они отключились, когда должны были работать, и в случае, если мы перезапустили их в то время, когда их нужно было закрыть.

Варианты: я думаю о запланированной задаче, которая запускает WSH/JScript каждые 10 минут. Псевдокод для JScript будет выглядеть примерно так:

  • Получить текущее время
  • If the current time is after 10pm but before 6am
    • call EnsureDowntime()
  • Else
    • call EnsureUptime()
  • EnsureDownime():
    • If the services are running, stop them
  • EnsureUptime():
    • If the services are not running, start them

Вопросы:

  • Является ли Scheduled Task/WSH/JScript лучшим способом сделать это или, по крайней мере, приемлемым способом?
  • вызывает новую дату () и использует .getHours () лучше всего, почему нужно найти время?
  • Мой псевдокод выглядит как лучший способ приблизиться к этому?
  • how can I detect the state of a service (running / non-running)?
    • or in this case, should I just start / stop the services regardless of state? If there are no errors and it won't re-start a service that's already started, I imagine I could just use "net start" and "net stop".

Заранее благодарим за любую помощь, которую вы можете оказать!


person SeanKilleen    schedule 14.10.2010    source источник


Ответы (2)


Догадаться!

Пошаговое руководство по решению

  • Во-первых, создайте запланированную задачу и укажите для нее файл .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, продукт, которым пользуется клиент. Разумеется, вы можете соответствующим образом изменить названия функций.
  • Обратите внимание на escape-символы для кавычек при запуске «net start» или «net stop» для имени службы.
  • Используйте полное имя службы, как оно указано в services.msc.

Пожалуйста, дайте мне знать, если у вас есть какие-либо вопросы или комментарии о том, как я могу улучшить код!

Спасибо,

-- Шон

person SeanKilleen    schedule 22.10.2010

Вы упомянули, что:

... (я обнаружил, что указание его непосредственно на .js не сработает)

Я тоже сталкивался с этим, когда пытался запустить файл WSH JS из планировщика заданий в Windows 2003. Я обнаружил, что в WIn7 его можно было запустить напрямую, просто указав ссылку на файл .js, но он не прошел параметры, по крайней мере, к скрипту, если он работает так же в планировщике 2003 года.

Я нашел обходной путь, который, кажется, работает, чтобы избежать необходимости в пакетном файле-заглушке, о котором вы упомянули: если вы просто добавляете к файлу .js префикс «WScript» (или «CScript») - полный путь не требуется, потому что они в %WINDIR%\system32, тогда у меня, кажется, работает, включая файл .js, передающий любые параметры.

person user2712225    schedule 23.08.2013