Показать полную графическую версию : Нужно ли завершать скрипт
У меня в планировщике win2008R2 по многу раз выполняется vbs-скрипт, начинающийся с нижеприведенных строк и кончающийся только закрытием лог-файла.
Dim WshShell
Dim fso
Dim LogFile
Dim fLog
Set WshShell = CreateObject("WScript.Shell")
Set fso = CreateObject("Scripting.FileSystemObject")
LogFile = Left(WScript.ScriptName,Len(WScript.ScriptName)-4) & ".log"
Set fLog = fso.OpenTextFile(LogFile, 8, True)
...
Иногда срывается выполнения скрипта из-за невозможности запуска программы в нем. После этого, несмотря на удаление зависшего задания в taskmgr, планировщик
прекращает выполнять скрипт и пишет в журнале, что задача запущена, а ее действие и прекращение не наступает, т.е. зависание.
Приходится полностью удалять задачу в планировщике и ее пересоздавать, чтоб дальше работала.
Не может ли быть такое поведение из-за того, что нет WshShell.Quit и закрытия fso ? Или это не обязательно? Сервер я после сбоя не перегружаю, потому что пользователи не дают.
megaloman
24-11-2019, 08:48
Имхо, аккуратнее надо делать скрипт, применять обработку ошибок, чтобы скрипт не выскакивал на окно с ошибочным неотвеченным сообщением. Для скрипта в планировщике Вы его не видите, а оно существует.
В этом смысле я бы больше доверял cmd
У меня в планировщике win2008R2 по многу раз выполняется vbs-скрипт »
как вы его запускаете?
несмотря на удаление зависшего задания в taskmgr, планировщик прекращает выполнять скрипт и пишет в журнале, что задача запущена »
в taskmgr не отображаются задания планировщика, только процессы - возможно вы не то или не всё "удаляете" - лучше через ProcessExplorer посмотреть дерево процессов (или хотя бы в Far'е в Process list проверить Parent PID того, что "удаляете")
нет WshShell.Quit и закрытия fso ? Или это не обязательно? »
Это не обязательно, но лучше явно освобождать ресурсы. Для этого в нормальный языках есть try-catch-finally. Прекратите уже мучать дохлую лошадь (vbs) - пишите на jscript - потом хотя бы сможете применить выработанные навыки в других областях.
У меня в планировщике win2008R2 по многу раз выполняется vbs-скрипт »
как вы его запускаете? »
Обычным образом: пишу в планировщике выполнить c:\folder\file.vbs
в taskmgr не отображаются задания планировщика, только процессы - возможно вы не то или не всё "удаляете" »
В скрипте после вышеописанного вступления запускается внешняя обработка 1с. Запущенный 1С с именем пользователя, от которого стартует скрипт, я вижу в taskmgr, тут ошибки быть не может. В нормальном режиме, когда обработка отработает за полминуты, процесс в taskmgr пропадает, а если она не может отработать, то процесс висит запущенным.
но лучше явно освобождать ресурсы. »
Т.к. скрипт запускается в день по 25 раз, а сервер может без перезагрузки висеть по многу дней, то, могут ли накопиться неосвобожденные ресурсы?
Как из освобождают, какими командами?
Прекратите уже мучать дохлую лошадь (vbs) - пишите на jscript »
Эти скрипты мне достались в наследство от предыдущего админа, они работают много лет(8-10), только сейчас приходится изменять конфигурации серверов.
Мне доставались в наследство и jscript. Никакой особой разницы в разбирательстве с ними не ощущаю.
Почему vbs дохлый?
Обычным образом: пишу в планировщике выполнить c:\folder\file.vbs »
обычно в планировщике прописывают явный запуск cscript.exe да ещё и с параметром B
Запущенный 1С с именем пользователя, от которого стартует скрипт, я вижу в taskmgr, тут ошибки быть не может. »
конечно это не ваша ошибка, что планировщик запускает wscript, а "удаляете" вы 1с.exe
конечно это не ваша ошибка, что планировщик запускает wscript, а "удаляете" вы 1с.exe »
А как мне закончить выполнение wscript в такой ситуации?
DJ Mogarych
25-11-2019, 09:49
Почему vbs дохлый? »
Потому что он уже давно не развивается, и с 2006 года существует Powershell как гораздо более удобная и современная замена.
Прекратите уже мучать дохлую лошадь (vbs) - пишите на jscript »
Как раз с VBScript проблемы очистки памяти нет. А вот для JScript пришлось целое обновление выпускать (для принудительного запуска процесса сборки «мусора»): Excel Does Not Shut Down When Automating from JScript - Office | Microsoft Docs (https://docs.microsoft.com/en-us/office/troubleshoot/excel/jscript-not-shut-down-excel).
А если вспомнить про то, что JScript в принципе не поддерживает передачу параметров по ссылке, а только по значению, и вспомнить, сколько методов Wbem используют именно передачу параметров по ссылке (для возврата значений), и вспомнить, в какую кучу кода это выливается в итоге на JScript — мой выбор однозначен.
P.S. try-catch-finally ещё надо уметь правильно пользовать. А с этим проблем ещё больше.
А как мне закончить выполнение wscript в такой ситуации? »
Никак не надо. Сделайте то, что написал коллега Busla:
обычно в планировщике прописывают явный запуск cscript.exe да ещё и с //B »
обычно в планировщике прописывают явный запуск cscript.exe да ещё и с //B »
А этот ключ В устранит таблички в запускаемом из скрипта 1С7.7?
В случае сбоя 1С именно они появляются обычно.
И как остановить скрипт, если 1с завис все-таки?
А этот ключ В устранит таблички в запускаемом из скрипта 1С7.7? »
Какие таблички?
Запустите:
wscript.exe /?
прочитайте.
В случае сбоя 1С именно они появляются обычно. »
Сбои 1С должны устраняться на стороне 1С. Ни пакетные файлы, ни Windows Script Host, ни PowerShell к ним никаким боком (в двух последних случаях — если не используется Automation).
И как остановить скрипт, если 1с завис все-таки? »
Почему Вы решили, что 1С — именно зависло?
Почему Вы решили, что 1С — именно зависло? »
Если 1с висит в таскменеджере и не заканчивается за 30 сек, то в нем ошибка, которая обычно выдается с табличкой о необходимости переиндексации базы 1с. Т.к. в скрипте 1с должна запускаться 4 раза, то нужно скинуть 4 зависа 1с, когда это произошло. База 1с в любой момент может приподнести такой "сюрприз", приходится вручную отслеживать.
wscript.exe /?
прочитайте. »
Непонятно про Logo. У меня по-умолчанию никаких сведений не выдается, когда vbs запускаю.
pavsem7, так это не «зависло». Как именно у Вас в скрипте организован запуск 1С?
У меня по-умолчанию никаких сведений не выдается, когда vbs запускаю. »
Это потому, что у Вас wscript.exe хостом по умолчанию является. Попробуйте Win-R, cmd.exe, и там — cscript.exe //logo и cscript.exe //nologo.
Как именно у Вас в скрипте организован запуск 1С? »
Вот так:
zapuskV7 = """C:\Program Files (x86)\1Cv77\BIN\1cv7.exe"""
basefolder = "C:\folder"
progV7 basefolder,"C:\1\obr.ert","78"
Sub progV7(basef,obr,parametr)
WriteLog " ------------------------------"
WriteLog " start: " & obr
Set xFile = fso.CreateTextFile(basef & "\ExtForms\Oper.txt",True)
xFile.WriteLine obr
xFile.WriteLine parametr
xFile.Close
strParam = " enterprise /d" & basef & " /nUser /pPass"
WriteLog " " & basef
If SV7(basef) = True Then
nErrCode = WshShell.Run (zapuskV7 & strParam,1,True)
WriteLog " Error code WshShell.Run: " & nErrCode
End If
WriteLog " end : " & obr
End sub
Function SV7(dir)
SV7 = True
fso.CopyFile "C:\folder\1susers.dbf", "C:\1\"
If Err.number <> 0 then
'база монопольно открыта
WriteLog " start cancelled [open exclusively], cant open dbf file ErrNumber=" & Err.Number
err.clear
On Error GoTo 0
SV7 = False
Exit Function
End if
Sub WriteLog(strLine)
fLog.WriteLine Date & " (" & Time & ") " & strLine
end sub
Строчка запуска progV7 ... повторяется 4 раза с разными параметрами для обработки obr.ert на языке 1cv7
nErrCode = WshShell.Run (zapuskV7 & strParam,1,True) »
Поскольку третий аргумент — True, нет никакого способа в принципе что-либо сделать: код в этом месте будет тупо стоять и ожидать завершения вызванного процесса.
pavsem7, файл с расширением *.vbs это просто текстовый файл. А вот расширение само по себе говорит о том что с этим текстом внутри файла дальше делать. В данном случае запуская планировщиком c:\script.vbs ты по факту запускаешь обработчик (wscript.exe или cscript.exe), которому на вход подаётся путь к коду (тексту) который надо выполнить.
Аналогия для лучшего понимания - когда ты открываешь Документ.docx ты ведь не запускаешь процесс Документ.docx. А запускается Microsoft Word (WINWORD.exe) которому на вход подаётся путь к Документ.docx. Тут то же самое.
нет никакого способа в принципе что-либо сделать »
Может быть, можно как-то отключать выполнение по времени? Например, если выполняется больше 2 минут, то снять задачу.
pavsem7, можно. Покажите скриншот дерева процессов wcsript.exe|cscript.exe → 1C….exe из Process Explorer'а в моменты а) нормальной работы 1С и б) «зависания» 1С.
Тем не менее, продолжаю настаивать на том, что разбираться надо с 1С, а не лепить костыли.
© OSzone.net 2001-2012
vBulletin v3.6.4, Copyright ©2000-2025, Jelsoft Enterprises Ltd.