Войти

Показать полную графическую версию : [решено] Перезагрузка при несоответствии файла определенным параметрам


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 минут.

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

Iska
28-01-2014, 00:43
Начнём с этого:
Но существуют несколько процессов, которые винда сама завершить не может и подвисает. »
Каких именно процессов? Почему не может?

krokradio
28-01-2014, 01:10
Каких именно процессов? Почему не может? »

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

Iska
28-01-2014, 02:55
Рекомендую всё-таки:

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

По поводу скрипта: в Вашем случае его использование фактически ничем не отличается от применения одной-единственной команды «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» с этим не справится :-).

Iska
28-01-2014, 14:06
В таком случае я бы сам добавил строку перезагрузки в 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 минут». »

Нужна.

Iska
28-01-2014, 15:20
На сколько я понимаю … вы в скрипте задаете в условии проверку наличия папки »
Да.

Эта папка существует всегда по умолчанию. »
А вдруг! Данная проверка ничем не вредит.

А проверить нужно именно наличие в ней созданного в этот день лог-файла формата ГГГГ-ММ-ЧЧ.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
Понял. Спасибо. Сейчас поставлю на проверку. О результате отпишусь.

Iska
28-01-2014, 16:41
и в нём же сделаете отсроченный на двадцать минут запуск, »
Прошу прощения, разумеется, следует читать — «отсроченный на десять минут».

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. Ошибки не выдает. Попробую поставить в планировщик

Iska
28-01-2014, 18:56
Сейчас попробовал сменить разрешение на 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") »

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

Iska
28-01-2014, 21:35
Угу :(. Моя вина. Исправьте «OperatingSystem» на «Win32_OperatingSystem».

krokradio
28-01-2014, 22:04
Все супер. Отработало на 5 балов. Спасибо вам огромное.




© OSzone.net 2001-2012