Компьютерный форум 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=343059)

pavsem7 23-11-2019 23:05 2897723

Нужно ли завершать скрипт
 
У меня в планировщике 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 2897743

Имхо, аккуратнее надо делать скрипт, применять обработку ошибок, чтобы скрипт не выскакивал на окно с ошибочным неотвеченным сообщением. Для скрипта в планировщике Вы его не видите, а оно существует.
В этом смысле я бы больше доверял cmd

Busla 24-11-2019 10:55 2897751

Цитата:

Цитата pavsem7
У меня в планировщике win2008R2 по многу раз выполняется vbs-скрипт »

как вы его запускаете?

Цитата:

Цитата pavsem7
несмотря на удаление зависшего задания в taskmgr, планировщик прекращает выполнять скрипт и пишет в журнале, что задача запущена »

в taskmgr не отображаются задания планировщика, только процессы - возможно вы не то или не всё "удаляете" - лучше через ProcessExplorer посмотреть дерево процессов (или хотя бы в Far'е в Process list проверить Parent PID того, что "удаляете")

Цитата:

Цитата pavsem7
нет WshShell.Quit и закрытия fso ? Или это не обязательно? »

Это не обязательно, но лучше явно освобождать ресурсы. Для этого в нормальный языках есть try-catch-finally. Прекратите уже мучать дохлую лошадь (vbs) - пишите на jscript - потом хотя бы сможете применить выработанные навыки в других областях.

pavsem7 24-11-2019 21:58 2897825

Цитата:

Цитата Busla
У меня в планировщике win2008R2 по многу раз выполняется vbs-скрипт »
как вы его запускаете? »

Обычным образом: пишу в планировщике выполнить c:\folder\file.vbs

Цитата:

Цитата Busla
в taskmgr не отображаются задания планировщика, только процессы - возможно вы не то или не всё "удаляете" »

В скрипте после вышеописанного вступления запускается внешняя обработка 1с. Запущенный 1С с именем пользователя, от которого стартует скрипт, я вижу в taskmgr, тут ошибки быть не может. В нормальном режиме, когда обработка отработает за полминуты, процесс в taskmgr пропадает, а если она не может отработать, то процесс висит запущенным.

Цитата:

Цитата Busla
но лучше явно освобождать ресурсы. »

Т.к. скрипт запускается в день по 25 раз, а сервер может без перезагрузки висеть по многу дней, то, могут ли накопиться неосвобожденные ресурсы?
Как из освобождают, какими командами?

Цитата:

Цитата Busla
Прекратите уже мучать дохлую лошадь (vbs) - пишите на jscript »

Эти скрипты мне достались в наследство от предыдущего админа, они работают много лет(8-10), только сейчас приходится изменять конфигурации серверов.
Мне доставались в наследство и jscript. Никакой особой разницы в разбирательстве с ними не ощущаю.
Почему vbs дохлый?

Busla 25-11-2019 00:16 2897855

Цитата:

Цитата pavsem7
Обычным образом: пишу в планировщике выполнить c:\folder\file.vbs »

обычно в планировщике прописывают явный запуск cscript.exe да ещё и с параметром B

Цитата:

Цитата pavsem7
Запущенный 1С с именем пользователя, от которого стартует скрипт, я вижу в taskmgr, тут ошибки быть не может. »

конечно это не ваша ошибка, что планировщик запускает wscript, а "удаляете" вы 1с.exe

pavsem7 25-11-2019 09:34 2897867

Цитата:

Цитата Busla
конечно это не ваша ошибка, что планировщик запускает wscript, а "удаляете" вы 1с.exe »

А как мне закончить выполнение wscript в такой ситуации?

DJ Mogarych 25-11-2019 09:49 2897871

Цитата:

Цитата pavsem7
Почему vbs дохлый? »

Потому что он уже давно не развивается, и с 2006 года существует Powershell как гораздо более удобная и современная замена.

Iska 25-11-2019 14:57 2897923

Цитата:

Цитата Busla
Прекратите уже мучать дохлую лошадь (vbs) - пишите на jscript »

Как раз с VBScript проблемы очистки памяти нет. А вот для JScript пришлось целое обновление выпускать (для принудительного запуска процесса сборки «мусора»): Excel Does Not Shut Down When Automating from JScript - Office | Microsoft Docs.

А если вспомнить про то, что JScript в принципе не поддерживает передачу параметров по ссылке, а только по значению, и вспомнить, сколько методов Wbem используют именно передачу параметров по ссылке (для возврата значений), и вспомнить, в какую кучу кода это выливается в итоге на JScript — мой выбор однозначен.

P.S. try-catch-finally ещё надо уметь правильно пользовать. А с этим проблем ещё больше.


Цитата:

Цитата pavsem7
А как мне закончить выполнение wscript в такой ситуации? »

Никак не надо. Сделайте то, что написал коллега Busla:
Цитата:

Цитата Busla
обычно в планировщике прописывают явный запуск cscript.exe да ещё и с //B »


pavsem7 25-11-2019 21:02 2897969

Цитата:

Цитата Iska
обычно в планировщике прописывают явный запуск cscript.exe да ещё и с //B »

А этот ключ В устранит таблички в запускаемом из скрипта 1С7.7?
В случае сбоя 1С именно они появляются обычно.

И как остановить скрипт, если 1с завис все-таки?

Iska 25-11-2019 23:05 2897979

Цитата:

Цитата pavsem7
А этот ключ В устранит таблички в запускаемом из скрипта 1С7.7? »

Какие таблички?

Запустите:
Код:

wscript.exe /?
прочитайте.

Цитата:

Цитата pavsem7
В случае сбоя 1С именно они появляются обычно. »

Сбои 1С должны устраняться на стороне 1С. Ни пакетные файлы, ни Windows Script Host, ни PowerShell к ним никаким боком (в двух последних случаях — если не используется Automation).

Цитата:

Цитата pavsem7
И как остановить скрипт, если 1с завис все-таки? »

Почему Вы решили, что 1С — именно зависло?

pavsem7 26-11-2019 22:26 2898103

Цитата:

Цитата Iska
Почему Вы решили, что 1С — именно зависло? »

Если 1с висит в таскменеджере и не заканчивается за 30 сек, то в нем ошибка, которая обычно выдается с табличкой о необходимости переиндексации базы 1с. Т.к. в скрипте 1с должна запускаться 4 раза, то нужно скинуть 4 зависа 1с, когда это произошло. База 1с в любой момент может приподнести такой "сюрприз", приходится вручную отслеживать.

Цитата:

Цитата Iska
wscript.exe /?
прочитайте. »

Непонятно про Logo. У меня по-умолчанию никаких сведений не выдается, когда vbs запускаю.

Iska 27-11-2019 02:17 2898120

pavsem7, так это не «зависло». Как именно у Вас в скрипте организован запуск 1С?

Цитата:

Цитата pavsem7
У меня по-умолчанию никаких сведений не выдается, когда vbs запускаю. »

Это потому, что у Вас wscript.exe хостом по умолчанию является. Попробуйте Win-R, cmd.exe, и там — cscript.exe //logo и cscript.exe //nologo.

pavsem7 27-11-2019 22:44 2898281

Цитата:

Цитата Iska
Как именно у Вас в скрипте организован запуск 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

Iska 28-11-2019 00:37 2898297

Цитата:

Цитата pavsem7
Код:

nErrCode = WshShell.Run (zapuskV7 & strParam,1,True)
»

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

Charg 28-11-2019 12:05 2898328

pavsem7, файл с расширением *.vbs это просто текстовый файл. А вот расширение само по себе говорит о том что с этим текстом внутри файла дальше делать. В данном случае запуская планировщиком c:\script.vbs ты по факту запускаешь обработчик (wscript.exe или cscript.exe), которому на вход подаётся путь к коду (тексту) который надо выполнить.

Аналогия для лучшего понимания - когда ты открываешь Документ.docx ты ведь не запускаешь процесс Документ.docx. А запускается Microsoft Word (WINWORD.exe) которому на вход подаётся путь к Документ.docx. Тут то же самое.

pavsem7 29-11-2019 10:54 2898460

Цитата:

Цитата Iska
нет никакого способа в принципе что-либо сделать »

Может быть, можно как-то отключать выполнение по времени? Например, если выполняется больше 2 минут, то снять задачу.

Iska 30-11-2019 09:55 2898598

pavsem7, можно. Покажите скриншот дерева процессов wcsript.exe|cscript.exe → 1C….exe из Process Explorer'а в моменты а) нормальной работы 1С и б) «зависания» 1С.

Тем не менее, продолжаю настаивать на том, что разбираться надо с 1С, а не лепить костыли.


Время: 02:59.

Время: 02:59.
© OSzone.net 2001-