WSH / JScript для запуска и остановки служб в зависимости от времени? - PullRequest
2 голосов
/ 14 октября 2010

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

Справочная информация : у нас есть программный пакет, который мы запускаем через сервисы.Услуги должны быть закрыты с 10 вечера до 6 утра.Мы также должны проверять каждые 10 минут, чтобы восстановить службы, если они перестали работать, когда они должны были работать, и если мы перезапустились в то время, когда они должны были быть закрыты.

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

  • Получить текущее время
  • Если текущее время - после 22:00, но до 6:00
    • , вызовите EnsureDowntime ()
  • Остальное
    • вызов EnsureUptime ()
  • EnsureDownime ():
    • Если службы запущены,остановите их
  • EnsureUptime ():
    • Если службы не запущены, запустите их

Вопросы :

  • Является ли Запланированная задача / WSH / JScript лучшим способом сделать это или, по крайней мере, приемлемым способом?
  • вызывает новую функцию Date () и использование .getHours () - лучшее, зачем искать время?
  • Выглядит ли мой псевдокод лучшим способом для этого?
  • Как я могу определить состояние службы (работает / не работает)?
    • или в этом случае я должен просто запускать / останавливать службы независимо от состояния?Если ошибок нет, и служба, которая уже запущена, не будет перезапущена, я думаю, я мог бы просто использовать «net start» и «net stop».

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

Ответы [ 2 ]

1 голос
/ 22 октября 2010

Разобрался!

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

  • Во-первых, создайте запланированное задание и укажите его в файле .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.

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

Спасибо,

- Шон

0 голосов
/ 23 августа 2013

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

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

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

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

...