Показать полную графическую версию : [решено] Перезагрузка при несоответствии файла определенным параметрам
krokradio
27-01-2014, 23:59
Компьютер радиостанции. Идет эфир. Каждый день в 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 минут.
Вот такая у меня задачка. Может кто помочь в решении этой проблемы?
Начнём с этого:
Но существуют несколько процессов, которые винда сама завершить не может и подвисает. »
Каких именно процессов? Почему не может?
krokradio
28-01-2014, 01:10
Каких именно процессов? Почему не может? »
При попытке перезагрузить стандартными средствами процедура доходит до появления логотипа винды и на этом останавливается. Не виснет полностью. Просто переливается. Какой-то из процессов остается незакрытым и мешает ей уйти в перезагрузку. Всего там 47 процессов. Какой именно из них держит - извините, не помню. Автоматизацию проводил мой отец 8 лет назад. Это что-то связанное с защитой от дурака. Возможно процесс блокировки ввода. Знаю точно, что скрипт http://forum.oszone.net/post-1888484-3.html проблему решает. Проверял сегодня. Если же имя процесса очень критично - попробую завтра вытянуть из отца, хотя сомневаюсь, что вспомнит. Возраст.
Рекомендую всё-таки:
а) указать название и версию Вашей ОС;
б) попросить модераторов перенести тему в раздел, соответствующий ОС, и там решать проблему с поиском данного процесса.
По поводу скрипта: в Вашем случае его использование фактически ничем не отличается от применения одной-единственной команды «shutdown.exe /r /f».
krokradio
28-01-2014, 12:11
указать название и версию Вашей ОС »
Win XP SP2 x86 чистая лицензионная.
По поводу скрипта: в Вашем случае его использование фактически ничем не отличается от применения одной-единственной команды «shutdown.exe /r /f» »
В таком случае я бы сам добавил строку перезагрузки в http://forum.oszone.net/post-1888484-3.html и все. Но мне важна автоматизация. Автоматический опрос и сверка времени создания лог-файла. «shutdown.exe /r /f» с этим не справится :-).
В таком случае я бы сам добавил строку перезагрузки в http://forum.oszone.net/post-1888484-3.html »
Туда параметр «/f» не нужен.
После загрузки винды с задержкой в 10 минут запускается скрипт »
Как будете реализовывать запуск?
идет проверка времени создания файла »
и запускается снова через 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
Как будете реализовывать запуск? »
Возможно автозапуск WSH timer как например такой (http://www.sql.ru/forum/419055/wsh-timer)
Полагаю, в этом случае речь должна вестись о времени последней модификации файла, а не о времени создания. »
Совершенно верно. В первом абзаце указал информация о времени последнего изменения файла постоянно меняется » а в четвертом перепуталпроверка времени создания файла ». Прошу прощения.
На сколько я понимаю (возможно ошибаюсь, не судите строго), вы в скрипте задаете в условии проверку наличия папки
strSourceFolder = "E:\Air\log"
With WScript.CreateObject("Scripting.FileSystemObject")
If .FolderExists(strSourceFolder) Then
WScript.Sleep 10 * 60 * 1000 »
Эта папка существует всегда по умолчанию. А проверить нужно именно наличие в ней созданного в этот день лог-файла формата ГГГГ-ММ-ЧЧ.LOG
Используется перезагрузка с принудительным снятием процессов. «WScript.Sleep 10 * 60 * 1000» — «с задержкой в 10 минут». »
Нужна.
На сколько я понимаю … вы в скрипте задаете в условии проверку наличия папки »
Да.
Эта папка существует всегда по умолчанию. »
А вдруг! Данная проверка ничем не вредит.
А проверить нужно именно наличие в ней созданного в этот день лог-файла формата ГГГГ-ММ-ЧЧ.LOG »
strFile = .BuildPath(strSourceFolder, CStr(Year(dtNow)) & "-" & Right("00" & CStr(Month(dtNow)), 2) & "-" & Right("00" & CStr(Day(dtNow)), 2) & ".log")
If .FileExists(strFile) Then
…»
Возможно автозапуск WSH timer как например такой (http://www.sql.ru/forum/419055/wsh-timer) »
Вам это не нужно:
Do
…
WScript.Sleep 20 * 60 * 1000
Loop
»
Я имел в виду — если Вы, например, будете запускать скрипт из Планировщика задач и в нём же сделаете отсроченный на двадцать десять минут запуск, тогда удалите:
WScript.Sleep 10 * 60 * 1000
Если без отсрочки запуска — тогда оставьте эту десятиминутную паузу в начале скрипта.
krokradio
28-01-2014, 15:40
Понял. Спасибо. Сейчас поставлю на проверку. О результате отпишусь.
и в нём же сделаете отсроченный на двадцать минут запуск, »
Прошу прощения, разумеется, следует читать — «отсроченный на десять минут».
krokradio
28-01-2014, 17:21
Я понял :-), спасибо.... Сегодня поставлю на отработку, или вечером или завтра отпишусь
krokradio
28-01-2014, 18:30
Видимо делаю что-то абсолютно не так. Не в ту степь полез.
Сохранил ваш код в текстовый файл Akelpadом. Кодировка 1251 ANSI. Сменил расширение на js. При запуске выдает ошибку WSH.
Сценарий: F:\reset.js
Строка: 1
Символ: 8
Ошибка: Предполагается наличие ";"
Код: 800A03EC
Источник: Ошибка компиляции Microsoft JScript
Сейчас попробовал сменить разрешение на vbs. Ошибки не выдает. Попробую поставить в планировщик
Сейчас попробовал сменить разрешение на vbs. »
Теперь верно.
krokradio
28-01-2014, 20:45
Не сработало. Остановил плейлист в 16-57. Сейчас 18-40. Лог не обновлялся. Проверял. Попытка запустить скрипт вручную тоже не дает результата. Такое впечатление, что он просто не запускается. Никаких сообщений вообще не выдает. В чем у меня может быть загвоздка? Когда пробовал запустить его вручную на другой машине с 7-й х64 - выдало сообщение об отсутствии папки. На этой вообще молчание, как будто ничего не происходит.
Вру. Выдало ошибку.
Строка 45
Символ 3
ошибка 0х80041010
код 80041010
Источник (null)
krokradio
28-01-2014, 21:05
For Each objSWbemObjectEx In .ConnectServer(".", "root\cimv2").ExecQuery("SELECT * FROM OperatingSystem") »
Я так понимаю вот эта строка
Угу :(. Моя вина. Исправьте «OperatingSystem» на «Win32_OperatingSystem».
krokradio
28-01-2014, 22:04
Все супер. Отработало на 5 балов. Спасибо вам огромное.
© OSzone.net 2001-2012
vBulletin v3.6.4, Copyright ©2000-2025, Jelsoft Enterprises Ltd.