Компьютерный форум OSzone.net  

Компьютерный форум OSzone.net (http://forum.oszone.net/index.php)
-   Скриптовые языки администрирования Windows (http://forum.oszone.net/forumdisplay.php?f=102)
-   -   [решено] Перезагрузка при несоответствии файла определенным параметрам (http://forum.oszone.net/showthread.php?t=276603)

krokradio 27-01-2014 23:59 2297575

Перезагрузка при несоответствии файла определенным параметрам
 
Компьютер радиостанции. Идет эфир. Каждый день в 00:00:01 в папке E\Air\log создается новый файл вида ГГГГ-ММ-ЧЧ.LOG куда прописывается каждый проигранный файл по его завершении. То есть информация о времени последнего изменения файла постоянно меняется каждые 1 - 70 минут (в зависимости от длительности файла или прямого эфира). За долгие года выстроен процесс полной автоматизации, но иногда вылазят непредвиденные ошибки в формировании плейлистов и машина может просто замолкнуть. А так как процесс вещания на 95% автоматизирован и не всегда получается вовремя промониторить эфир, бывали случаи, что радио молчало по пол дня и больше. Проблема ошибок формирования плейлистов решается обычной перезагрузкой. Но существуют несколько процессов, которые винда сама завершить не может и подвисает.

Логика решения этой проблемы у меня выстроилась, но писать скрипты я не умею. И если еще с чем-то простеньким я сумею быстро разобраться, то на такое понадобится много времени.

После загрузки винды с задержкой в 10 минут запускается скрипт, который проверяет наличие созданного сегодня лог-файла. При ошибке (файла нет) идет сначала команда на прекращение всех сторонних процессов (как здесь http://forum.oszone.net/post-1888484-3.html), после чего идет команда на перезагрузку ПК.

Если файл есть - идет проверка времени создания файла и сравнения его с системным временем. В случае, если время различается более, чем на 70 минут - опять таки идет сначала команда на прекращение всех сторонних процессов (как здесь http://forum.oszone.net/post-1888484-3.html), после чего идет команда на перезагрузку ПК.

Если время различается менее, чем на 70 минут - процедура проверки завершается и запускается снова через 20 минут.

Вот такая у меня задачка. Может кто помочь в решении этой проблемы?

Iska 28-01-2014 00:43 2297601

Начнём с этого:
Цитата:

Цитата krokradio
Но существуют несколько процессов, которые винда сама завершить не может и подвисает. »

Каких именно процессов? Почему не может?

krokradio 28-01-2014 01:10 2297608

Цитата:

Цитата Iska
Каких именно процессов? Почему не может? »

При попытке перезагрузить стандартными средствами процедура доходит до появления логотипа винды и на этом останавливается. Не виснет полностью. Просто переливается. Какой-то из процессов остается незакрытым и мешает ей уйти в перезагрузку. Всего там 47 процессов. Какой именно из них держит - извините, не помню. Автоматизацию проводил мой отец 8 лет назад. Это что-то связанное с защитой от дурака. Возможно процесс блокировки ввода. Знаю точно, что скрипт http://forum.oszone.net/post-1888484-3.html проблему решает. Проверял сегодня. Если же имя процесса очень критично - попробую завтра вытянуть из отца, хотя сомневаюсь, что вспомнит. Возраст.

Iska 28-01-2014 02:55 2297628

Рекомендую всё-таки:

а) указать название и версию Вашей ОС;
б) попросить модераторов перенести тему в раздел, соответствующий ОС, и там решать проблему с поиском данного процесса.

По поводу скрипта: в Вашем случае его использование фактически ничем не отличается от применения одной-единственной команды «shutdown.exe /r /f».

krokradio 28-01-2014 12:11 2297766

Цитата:

Цитата Iska
указать название и версию Вашей ОС »

Win XP SP2 x86 чистая лицензионная.

Цитата:

Цитата Iska
По поводу скрипта: в Вашем случае его использование фактически ничем не отличается от применения одной-единственной команды «shutdown.exe /r /f» »

В таком случае я бы сам добавил строку перезагрузки в http://forum.oszone.net/post-1888484-3.html и все. Но мне важна автоматизация. Автоматический опрос и сверка времени создания лог-файла. «shutdown.exe /r /f» с этим не справится :-).

Iska 28-01-2014 14:06 2297833

Цитата:

Цитата krokradio
В таком случае я бы сам добавил строку перезагрузки в http://forum.oszone.net/post-1888484-3.html »

Туда параметр «/f» не нужен.


Цитата:

Цитата krokradio
После загрузки винды с задержкой в 10 минут запускается скрипт »

Как будете реализовывать запуск?

Цитата:

Цитата krokradio
идет проверка времени создания файла »

Цитата:

Цитата krokradio
и запускается снова через 20 минут. »

Полагаю, в этом случае речь должна вестись о времени последней модификации файла, а не о времени создания.

На WSH:
читать дальше »
Код:

Option Explicit

Dim strSourceFolder

Dim dtNow
Dim strFile


strSourceFolder = "E:\Air\log"

With WScript.CreateObject("Scripting.FileSystemObject")
        If .FolderExists(strSourceFolder) Then
                WScript.Sleep 10 * 60 * 1000
               
                Do
                        dtNow = Now()
                        strFile = .BuildPath(strSourceFolder, CStr(Year(dtNow)) & "-" & Right("00" & CStr(Month(dtNow)), 2) & "-" & Right("00" & CStr(Day(dtNow)), 2) & ".log")
                       
                        If .FileExists(strFile) Then
                                If Abs(DateDiff("n", dtNow, .GetFile(strFile).DateLastModified)) > 70 Then
                                        ShutdownSystem
                                End If
                        Else
                                ShutdownSystem
                        End If
                       
                        WScript.Sleep 20 * 60 * 1000
                Loop
        Else
                WScript.Echo "Source folder [" & strSourceFolder & "] not found."
                WScript.Quit 1
        End If
End With

WScript.Quit 0
'=============================================================================

'=============================================================================
Sub ShutdownSystem()
        Dim objSWbemObjectEx
       
        With WScript.CreateObject("WbemScripting.SWbemLocator")
                .Security_.Privileges.AddAsString "SeShutdownPrivilege", True
               
                For Each objSWbemObjectEx In .ConnectServer(".", "root\cimv2").ExecQuery("SELECT * FROM Win32_OperatingSystem")
                        objSWbemObjectEx.Win32Shutdown 6
                Next
        End With
End Sub
'=============================================================================


Используется перезагрузка с принудительным снятием процессов. «WScript.Sleep 10 * 60 * 1000» — «с задержкой в 10 минут». Если в самом скрипте не нужна — закомментируйте или удалите.

krokradio 28-01-2014 15:09 2297878

Цитата:

Цитата Iska
Как будете реализовывать запуск? »

Возможно автозапуск WSH timer как например такой (http://www.sql.ru/forum/419055/wsh-timer)

Цитата:

Цитата Iska
Полагаю, в этом случае речь должна вестись о времени последней модификации файла, а не о времени создания. »

Совершенно верно. В первом абзаце указал
Цитата:

Цитата krokradio
информация о времени последнего изменения файла постоянно меняется »

а в четвертом перепутал
Цитата:

Цитата krokradio
проверка времени создания файла »

. Прошу прощения.

На сколько я понимаю (возможно ошибаюсь, не судите строго), вы в скрипте задаете в условии проверку наличия папки
Цитата:

Цитата Iska
strSourceFolder = "E:\Air\log"
With WScript.CreateObject("Scripting.FileSystemObject")
If .FolderExists(strSourceFolder) Then
WScript.Sleep 10 * 60 * 1000 »

Эта папка существует всегда по умолчанию. А проверить нужно именно наличие в ней созданного в этот день лог-файла формата ГГГГ-ММ-ЧЧ.LOG

Цитата:

Цитата Iska
Используется перезагрузка с принудительным снятием процессов. «WScript.Sleep 10 * 60 * 1000» — «с задержкой в 10 минут». »

Нужна.

Iska 28-01-2014 15:20 2297889

Цитата:

Цитата krokradio
На сколько я понимаю … вы в скрипте задаете в условии проверку наличия папки »

Да.

Цитата:

Цитата krokradio
Эта папка существует всегда по умолчанию. »

А вдруг! Данная проверка ничем не вредит.

Цитата:

Цитата krokradio
А проверить нужно именно наличие в ней созданного в этот день лог-файла формата ГГГГ-ММ-ЧЧ.LOG »

Цитата:

Цитата Iska
Код:

strFile = .BuildPath(strSourceFolder, CStr(Year(dtNow)) & "-" & Right("00" & CStr(Month(dtNow)), 2) & "-" & Right("00" & CStr(Day(dtNow)), 2) & ".log")

If .FileExists(strFile) Then
    …

»

Цитата:

Цитата krokradio
Возможно автозапуск WSH timer как например такой (http://www.sql.ru/forum/419055/wsh-timer) »

Вам это не нужно:
Цитата:

Цитата Iska
Код:

                Do
                        …
                        WScript.Sleep 20 * 60 * 1000
                Loop

»

Я имел в виду — если Вы, например, будете запускать скрипт из Планировщика задач и в нём же сделаете отсроченный на двадцать десять минут запуск, тогда удалите:
Код:

WScript.Sleep 10 * 60 * 1000
Если без отсрочки запуска — тогда оставьте эту десятиминутную паузу в начале скрипта.

krokradio 28-01-2014 15:40 2297904

Понял. Спасибо. Сейчас поставлю на проверку. О результате отпишусь.

Iska 28-01-2014 16:41 2297959

Цитата:

Цитата Iska
и в нём же сделаете отсроченный на двадцать минут запуск, »

Прошу прощения, разумеется, следует читать — «отсроченный на десять минут».

krokradio 28-01-2014 17:21 2297978

Я понял :-), спасибо.... Сегодня поставлю на отработку, или вечером или завтра отпишусь

krokradio 28-01-2014 18:30 2298033

Видимо делаю что-то абсолютно не так. Не в ту степь полез.

Сохранил ваш код в текстовый файл Akelpadом. Кодировка 1251 ANSI. Сменил расширение на js. При запуске выдает ошибку WSH.
Сценарий: F:\reset.js
Строка: 1
Символ: 8
Ошибка: Предполагается наличие ";"
Код: 800A03EC
Источник: Ошибка компиляции Microsoft JScript


Сейчас попробовал сменить разрешение на vbs. Ошибки не выдает. Попробую поставить в планировщик

Iska 28-01-2014 18:56 2298044

Цитата:

Цитата krokradio
Сейчас попробовал сменить разрешение на vbs. »

Теперь верно.

krokradio 28-01-2014 20:45 2298098

Не сработало. Остановил плейлист в 16-57. Сейчас 18-40. Лог не обновлялся. Проверял. Попытка запустить скрипт вручную тоже не дает результата. Такое впечатление, что он просто не запускается. Никаких сообщений вообще не выдает. В чем у меня может быть загвоздка? Когда пробовал запустить его вручную на другой машине с 7-й х64 - выдало сообщение об отсутствии папки. На этой вообще молчание, как будто ничего не происходит.

Вру. Выдало ошибку.

Строка 45
Символ 3
ошибка 0х80041010
код 80041010
Источник (null)

krokradio 28-01-2014 21:05 2298109

Цитата:

Цитата Iska
For Each objSWbemObjectEx In .ConnectServer(".", "root\cimv2").ExecQuery("SELECT * FROM OperatingSystem") »

Я так понимаю вот эта строка

Iska 28-01-2014 21:35 2298131

Угу :(. Моя вина. Исправьте «OperatingSystem» на «Win32_OperatingSystem».

krokradio 28-01-2014 22:04 2298156

Все супер. Отработало на 5 балов. Спасибо вам огромное.


Время: 01:07.

Время: 01:07.
© OSzone.net 2001-