После работы шаблона через сутки начинается глюки и тормоза. Нагрузка на сервер падает стремительно к 0, а память до 100 % вырастает вдруг.

AndreyAAA

Client
Регистрация
07.05.2016
Сообщения
1 266
Благодарностей
82
Баллы
48
Здравствуйте, проблемма такая, запускаю шаблон в работу.Например 20-30 потоков, нагрузка на сервер нормальная 70-80 %, а памяти вообще до 50 % используется. Но через некоторое время шаблон перестает нормально работать.
ВОт такая хрень на процессе, хотя потоков количество не менялось, а сам процесс силпно тормозит, так что приходится ждать 2-5 минуты что бы перезагрузить зенку.

После перезагрузки все нормально какое то время, а потом опять жопа!(((( Версия зенки были разные, и сейчас последня.
Настройки как и на других серверах (где другие шаблоны работают нормально), да и сервера такие же.
Сам шаблон довольно обычный, фарм профилей можно сказать, браузер cromium .
 

zarufakis

Client
Регистрация
22.03.2019
Сообщения
1 928
Благодарностей
1 332
Баллы
113
При работе в веб постоянно пожирает память. Как с этим бороться даже разработчики не знают.
Либо перезапускай зенку по заданию, либо, переписывай шаблоны на запросы где это возможно.
 

AndreyAAA

Client
Регистрация
07.05.2016
Сообщения
1 266
Благодарностей
82
Баллы
48
При работе в веб постоянно пожирает память. Как с этим бороться даже разработчики не знают.
Либо перезапускай зенку по заданию, либо, переписывай шаблоны на запросы где это возможно.
то не серьездно даже как то.
ПОхожие шаблоны мои работают стабильно, на том же сервере, и ничего не жрет. Тут дело в том что сама производительность с каздхум часом стремиться к 0
 

zarufakis

Client
Регистрация
22.03.2019
Сообщения
1 928
Благодарностей
1 332
Баллы
113
Смотри файлы привязанные к спискам не должны быть большого размера. Лучше переделай все на базу. Зенносписки пожирают память как бык помои.
 
  • Спасибо
Реакции: Truelife

Jufel

Client
Регистрация
12.06.2018
Сообщения
1 506
Благодарностей
1 024
Баллы
113
Если работа в шаблоне зациклена без завершения, то тоже могут быть проблемы
 

AndreyAAA

Client
Регистрация
07.05.2016
Сообщения
1 266
Благодарностей
82
Баллы
48
Я это все знаю, дело не в этом, тут глюк другой точно(
 

flySP

Client
Регистрация
30.09.2025
Сообщения
5
Благодарностей
0
Баллы
1
Смотри файлы привязанные к спискам не должны быть большого размера. Лучше переделай все на базу. Зенносписки пожирают память как бык помои.
Поясните, что значит : Лучше переделай все на базу ?
 

Livesferma

Client
Регистрация
22.10.2020
Сообщения
55
Благодарностей
11
Баллы
8
Поясните, что значит : Лучше переделай все на базу ?
Использовать например базу данных MySql, получать данные с сервера через базу вместо использования списков(текстовых файлов).
 
  • Спасибо
Реакции: flySP

zarufakis

Client
Регистрация
22.03.2019
Сообщения
1 928
Благодарностей
1 332
Баллы
113
Сворганил для себя костыль, и он работает. Это еще не окончательный вариант, каждый может подкрутить под себя.
Пинцип работы:
- проверяет, запущена ли зенка или нет
- если не запущена, запускает
- если запущена - проверяет сколько забито памяти
- если превышен предел - убивает процесс
- ждет 30 секунд (тут есть лаги)
- запускает версию зенки указанную в FORCE_VERSION

добавляете в планировщик, выполнение раз в 10 минут

Bash:
@echo off
setlocal enabledelayedexpansion
chcp 1251 > nul

rem Фиксированный путь к ZennoPoster
set "ZP_BASE=C:\Program Files\ZennoLab\RU\ZennoPoster Pro V7"

rem Порог использования памяти в процентах
set "MEMORY_THRESHOLD=83"

rem Указать конкретную версию для запуска (например: 7.8.6.0) или оставить пустым для последней версии
set "FORCE_VERSION=7.8.6.0"

rem Путь к лог-файлу
set "LOG_FILE=%~dp0zennoposter_log.txt"

rem Запись в лог о начале работы
call :log "=========================================="
call :log "Запуск скрипта start_zennoposter.bat"
call :log "=========================================="

rem Проверяем, запущен ли уже ZennoPoster
call :log "Проверка запущен ли процесс ZennoPoster.exe..."
tasklist | find /i "ZennoPoster.exe" > nul
if errorlevel 1 (
    call :log "Процесс ZennoPoster.exe не обнаружен"
    echo ZennoPoster не запущен. Запускаем...
    call :start_zennoposter
    echo.
    echo ZennoPoster успешно запущен!
    call :log "ZennoPoster успешно запущен"
    goto :end_script
)

rem ZennoPoster запущен - проверяем память
call :log "Процесс ZennoPoster.exe запущен"
echo ZennoPoster уже запущен.
echo.
echo Проверка текущего состояния памяти...
call :log "Начало проверки использования памяти..."
call :check_memory

if !errorlevel! equ 1 (
    call :log "ВНИМАНИЕ! Использование памяти превысило порог !MEMORY_THRESHOLD!%%"
    echo.
    echo ВНИМАНИЕ! Использование памяти превысило порог !MEMORY_THRESHOLD!%%
    echo Выполняется перезапуск ZennoPoster...
    echo.
    
    rem Завершаем процесс
    echo Завершение процесса ZennoPoster...
    call :log "Завершение процесса ZennoPoster.exe..."
    taskkill /F /IM "ZennoPoster.exe" > nul 2>&1
    call :log "Процесс ZennoPoster.exe завершён"
    
    rem Ждем 30 секунд
    echo Ожидание 30 секунд перед перезапуском...
    call :log "Ожидание 30 секунд перед перезапуском..."
    ping 127.0.0.1 -n 31 > nul
    call :log "Ожидание завершено"
    
    rem Запускаем снова
    echo.
    echo Перезапуск ZennoPoster...
    call :log "Начало перезапуска ZennoPoster..."
    call :start_zennoposter
    echo.
    echo Перезапуск завершён!
    call :log "Перезапуск ZennoPoster завершён успешно"
) else (
    call :log "Использование памяти в норме (не превышает порог !MEMORY_THRESHOLD!%%)"
    echo.
    echo Память в норме.
)

goto :end_script

rem ============================================
rem Функция запуска ZennoPoster
rem ============================================
:start_zennoposter
    call :log "Функция :start_zennoposter - начало выполнения"
    echo Проверка пути: "!ZP_BASE!"
    call :log "Проверка базового пути: !ZP_BASE!"
    
    if not exist "!ZP_BASE!" (
        call :log "ОШИБКА: Путь не найден: !ZP_BASE!"
        echo Путь не найден: "!ZP_BASE!"
        goto :eof
    )
    
    call :log "Базовый путь существует"
    
    rem Если указана конкретная версия
    if defined FORCE_VERSION (
        call :log "Используется принудительная версия: !FORCE_VERSION!"
        set "zp_path=!ZP_BASE!\!FORCE_VERSION!\Progs\ZennoPoster.exe"
        if exist "!zp_path!" (
            call :log "Файл найден: !zp_path!"
            echo Использование указанной версии: !FORCE_VERSION!
            echo Запуск: "!zp_path!"
            call :log "Запуск ZennoPoster версии !FORCE_VERSION!"
            start "" "!zp_path!"
            call :log "Команда запуска выполнена успешно"
            goto :eof
        ) else (
            call :log "ОШИБКА: Указанная версия !FORCE_VERSION! не найдена по пути: !zp_path!"
            echo ОШИБКА: Указанная версия !FORCE_VERSION! не найдена!
            echo Путь не существует: "!zp_path!"
            goto :eof
        )
    )
    
    rem Если версия не указана - ищем последнюю
    call :log "Версия не указана, выполняется поиск последней версии"
    echo Сканирование версий в папке: "!ZP_BASE!"
    
    rem Временный файл для сохранения путей версий
    set "temp_file=%TEMP%\zp_versions.txt"
    if exist "!temp_file!" del "!temp_file!"
    call :log "Создан временный файл для списка версий: !temp_file!"
    
    rem Собираем все пути к версиям
    call :log "Начало сканирования доступных версий..."
    for /F "delims=" %%d in ('dir /B /AD "!ZP_BASE!\*.*.*.*" 2^>nul') do (
        if exist "!ZP_BASE!\%%d\Progs\ZennoPoster.exe" (
            call :log "Найдена версия: %%d"
            echo %%d>>"!temp_file!"
        )
    )
    
    if not exist "!temp_file!" (
        call :log "ОШИБКА: Не найдены доступные версии ZennoPoster"
        echo Не найдены доступные версии ZennoPoster.
        goto :eof
    )
    
    rem Находим самую свежую версию
    call :log "Начало поиска самой новой версии..."
    set "highest_ver=0.0.0.0"
    set "zp_path="
    
    for /F "delims=" %%v in (!temp_file!) do (
        call :compare_version "%%v" "!highest_ver!"
        if !errorlevel! gtr 0 (
            set "highest_ver=%%v"
            set "zp_path=!ZP_BASE!\%%v\Progs\ZennoPoster.exe"
            call :log "Обновлена кандидатская версия: %%v"
        )
    )
    
    if defined zp_path (
        call :log "Определена самая новая версия: !highest_ver!"
        call :log "Путь к исполняемому файлу: !zp_path!"
        echo Найдена самая новая версия: !highest_ver!
        echo Запуск: "!zp_path!"
        call :log "Запуск ZennoPoster версии !highest_ver!"
        start "" "!zp_path!"
        call :log "Команда запуска выполнена успешно"
    ) else (
        call :log "ОШИБКА: Не удалось найти исполняемый файл ZennoPoster"
        echo Не удалось найти исполняемый файл ZennoPoster.
    )
    
    rem Удаляем временный файл
    if exist "!temp_file!" del "!temp_file!"
    call :log "Временный файл удалён"
    call :log "Функция :start_zennoposter - завершение выполнения"
    goto :eof

rem ============================================
rem Функция проверки памяти
rem ============================================
:check_memory
    call :log "Функция :check_memory - начало выполнения"
    
    rem Получаем общий объем оперативной памяти и свободную память
    call :log "Получение информации об объеме памяти через WMIC..."
    for /f "skip=1 tokens=2 delims==" %%a in ('wmic OS get TotalVisibleMemorySize /value') do (
        set "total_mem_raw=%%a"
        set "total_mem_raw=!total_mem_raw: =!"
        if defined total_mem_raw set /a total_mem=!total_mem_raw!
    )
    
    for /f "skip=1 tokens=2 delims==" %%a in ('wmic OS get FreePhysicalMemory /value') do (
        set "free_mem_raw=%%a"
        set "free_mem_raw=!free_mem_raw: =!"
        if defined free_mem_raw set /a free_mem=!free_mem_raw!
    )
    
    call :log "Получено: total_mem=!total_mem! KB, free_mem=!free_mem! KB"
    
    rem Проверяем корректность полученных данных
    if not defined total_mem (
        call :log "ОШИБКА: не удалось получить общий объем памяти"
        echo Ошибка: не удалось получить общий объем памяти
        exit /b 0
    )
    if not defined free_mem (
        call :log "ОШИБКА: не удалось получить объем свободной памяти"
        echo Ошибка: не удалось получить объем свободной памяти
        exit /b 0
    )
    if !total_mem! lss 1 (
        call :log "ОШИБКА: некорректное значение общей памяти"
        echo Ошибка: некорректное значение общей памяти
        exit /b 0
    )
    
    call :log "Данные корректны, начало расчётов..."
    
    rem Вычисляем использованную память
    set /a used_mem=total_mem-free_mem
    
    rem Переводим в МБ для избежания переполнения при вычислении процента
    set /a total_mem_mb=total_mem/1024
    set /a used_mem_mb=used_mem/1024
    
    call :log "Конвертация в MB: total=!total_mem_mb! MB, used=!used_mem_mb! MB"
    
    rem Вычисляем процент использования памяти
    set /a mem_usage=(used_mem_mb*100)/total_mem_mb
    
    call :log "Рассчитан процент использования памяти: !mem_usage!%%"
    echo Использование памяти: !mem_usage!%% (используется !used_mem_mb! MB из !total_mem_mb! MB)
    call :log "Использование памяти: !mem_usage!%% (используется !used_mem_mb! MB из !total_mem_mb! MB)"
    
    rem Проверяем, превышен ли порог
    if !mem_usage! gtr !MEMORY_THRESHOLD! (
        call :log "Порог !MEMORY_THRESHOLD!%% ПРЕВЫШЕН (текущее: !mem_usage!%%)"
        call :log "Функция :check_memory - возврат кода 1 (превышение порога)"
        exit /b 1
    ) else (
        call :log "Порог !MEMORY_THRESHOLD!%% НЕ превышен (текущее: !mem_usage!%%)"
        call :log "Функция :check_memory - возврат кода 0 (норма)"
        exit /b 0
    )

rem ============================================
rem Функция сравнения версий
rem ============================================
:compare_version
    setlocal EnableDelayedExpansion
    set "ver1=%~1"
    set "ver2=%~2"
    
    for /F "tokens=1-4 delims=." %%a in ("!ver1!") do (
        set /a v1=%%a, v2=%%b, v3=%%c, v4=%%d
    )
    
    for /F "tokens=1-4 delims=." %%a in ("!ver2!") do (
        set /a w1=%%a, w2=%%b, w3=%%c, w4=%%d
    )
    
    if !v1! gtr !w1! exit /b 1
    if !v1! lss !w1! exit /b -1
    if !v2! gtr !w2! exit /b 1
    if !v2! lss !w2! exit /b -1
    if !v3! gtr !w3! exit /b 1
    if !v3! lss !w3! exit /b -1
    if !v4! gtr !w4! exit /b 1
    if !v4! lss !w4! exit /b -1
    exit /b 0

:end_script
call :log "Завершение работы скрипта"
call :log "=========================================="
call :log ""
echo.
echo Окно закроется через 5 секунд...
timeout /t 5 /nobreak > nul
endlocal
exit /b

rem ============================================
rem Функция логирования
rem ============================================
:log
    setlocal enabledelayedexpansion
    set "message=%~1"
    
    rem Получаем текущую дату и время
    for /f "tokens=1-4 delims=/ " %%a in ('date /t') do (
        set "log_date=%%a.%%b.%%c"
    )
    for /f "tokens=1-2 delims=: " %%a in ('time /t') do (
        set "log_time=%%a:%%b"
    )
    
    rem Записываем в лог-файл
    echo [%log_date% %log_time%] %message% >> "%LOG_FILE%"
    
    endlocal
    goto :eof
 

Livesferma

Client
Регистрация
22.10.2020
Сообщения
55
Благодарностей
11
Баллы
8
Сворганил для себя костыль, и он работает. Это еще не окончательный вариант, каждый может подкрутить под себя.
Пинцип работы:
- проверяет, запущена ли зенка или нет
- если не запущена, запускает
- если запущена - проверяет сколько забито памяти
- если превышен предел - убивает процесс
- ждет 30 секунд (тут есть лаги)
- запускает версию зенки указанную в FORCE_VERSION

добавляете в планировщик, выполнение раз в 10 минут

Bash:
@echo off
setlocal enabledelayedexpansion
chcp 1251 > nul

rem Фиксированный путь к ZennoPoster
set "ZP_BASE=C:\Program Files\ZennoLab\RU\ZennoPoster Pro V7"

rem Порог использования памяти в процентах
set "MEMORY_THRESHOLD=83"

rem Указать конкретную версию для запуска (например: 7.8.6.0) или оставить пустым для последней версии
set "FORCE_VERSION=7.8.6.0"

rem Путь к лог-файлу
set "LOG_FILE=%~dp0zennoposter_log.txt"

rem Запись в лог о начале работы
call :log "=========================================="
call :log "Запуск скрипта start_zennoposter.bat"
call :log "=========================================="

rem Проверяем, запущен ли уже ZennoPoster
call :log "Проверка запущен ли процесс ZennoPoster.exe..."
tasklist | find /i "ZennoPoster.exe" > nul
if errorlevel 1 (
    call :log "Процесс ZennoPoster.exe не обнаружен"
    echo ZennoPoster не запущен. Запускаем...
    call :start_zennoposter
    echo.
    echo ZennoPoster успешно запущен!
    call :log "ZennoPoster успешно запущен"
    goto :end_script
)

rem ZennoPoster запущен - проверяем память
call :log "Процесс ZennoPoster.exe запущен"
echo ZennoPoster уже запущен.
echo.
echo Проверка текущего состояния памяти...
call :log "Начало проверки использования памяти..."
call :check_memory

if !errorlevel! equ 1 (
    call :log "ВНИМАНИЕ! Использование памяти превысило порог !MEMORY_THRESHOLD!%%"
    echo.
    echo ВНИМАНИЕ! Использование памяти превысило порог !MEMORY_THRESHOLD!%%
    echo Выполняется перезапуск ZennoPoster...
    echo.
   
    rem Завершаем процесс
    echo Завершение процесса ZennoPoster...
    call :log "Завершение процесса ZennoPoster.exe..."
    taskkill /F /IM "ZennoPoster.exe" > nul 2>&1
    call :log "Процесс ZennoPoster.exe завершён"
   
    rem Ждем 30 секунд
    echo Ожидание 30 секунд перед перезапуском...
    call :log "Ожидание 30 секунд перед перезапуском..."
    ping 127.0.0.1 -n 31 > nul
    call :log "Ожидание завершено"
   
    rem Запускаем снова
    echo.
    echo Перезапуск ZennoPoster...
    call :log "Начало перезапуска ZennoPoster..."
    call :start_zennoposter
    echo.
    echo Перезапуск завершён!
    call :log "Перезапуск ZennoPoster завершён успешно"
) else (
    call :log "Использование памяти в норме (не превышает порог !MEMORY_THRESHOLD!%%)"
    echo.
    echo Память в норме.
)

goto :end_script

rem ============================================
rem Функция запуска ZennoPoster
rem ============================================
:start_zennoposter
    call :log "Функция :start_zennoposter - начало выполнения"
    echo Проверка пути: "!ZP_BASE!"
    call :log "Проверка базового пути: !ZP_BASE!"
   
    if not exist "!ZP_BASE!" (
        call :log "ОШИБКА: Путь не найден: !ZP_BASE!"
        echo Путь не найден: "!ZP_BASE!"
        goto :eof
    )
   
    call :log "Базовый путь существует"
   
    rem Если указана конкретная версия
    if defined FORCE_VERSION (
        call :log "Используется принудительная версия: !FORCE_VERSION!"
        set "zp_path=!ZP_BASE!\!FORCE_VERSION!\Progs\ZennoPoster.exe"
        if exist "!zp_path!" (
            call :log "Файл найден: !zp_path!"
            echo Использование указанной версии: !FORCE_VERSION!
            echo Запуск: "!zp_path!"
            call :log "Запуск ZennoPoster версии !FORCE_VERSION!"
            start "" "!zp_path!"
            call :log "Команда запуска выполнена успешно"
            goto :eof
        ) else (
            call :log "ОШИБКА: Указанная версия !FORCE_VERSION! не найдена по пути: !zp_path!"
            echo ОШИБКА: Указанная версия !FORCE_VERSION! не найдена!
            echo Путь не существует: "!zp_path!"
            goto :eof
        )
    )
   
    rem Если версия не указана - ищем последнюю
    call :log "Версия не указана, выполняется поиск последней версии"
    echo Сканирование версий в папке: "!ZP_BASE!"
   
    rem Временный файл для сохранения путей версий
    set "temp_file=%TEMP%\zp_versions.txt"
    if exist "!temp_file!" del "!temp_file!"
    call :log "Создан временный файл для списка версий: !temp_file!"
   
    rem Собираем все пути к версиям
    call :log "Начало сканирования доступных версий..."
    for /F "delims=" %%d in ('dir /B /AD "!ZP_BASE!\*.*.*.*" 2^>nul') do (
        if exist "!ZP_BASE!\%%d\Progs\ZennoPoster.exe" (
            call :log "Найдена версия: %%d"
            echo %%d>>"!temp_file!"
        )
    )
   
    if not exist "!temp_file!" (
        call :log "ОШИБКА: Не найдены доступные версии ZennoPoster"
        echo Не найдены доступные версии ZennoPoster.
        goto :eof
    )
   
    rem Находим самую свежую версию
    call :log "Начало поиска самой новой версии..."
    set "highest_ver=0.0.0.0"
    set "zp_path="
   
    for /F "delims=" %%v in (!temp_file!) do (
        call :compare_version "%%v" "!highest_ver!"
        if !errorlevel! gtr 0 (
            set "highest_ver=%%v"
            set "zp_path=!ZP_BASE!\%%v\Progs\ZennoPoster.exe"
            call :log "Обновлена кандидатская версия: %%v"
        )
    )
   
    if defined zp_path (
        call :log "Определена самая новая версия: !highest_ver!"
        call :log "Путь к исполняемому файлу: !zp_path!"
        echo Найдена самая новая версия: !highest_ver!
        echo Запуск: "!zp_path!"
        call :log "Запуск ZennoPoster версии !highest_ver!"
        start "" "!zp_path!"
        call :log "Команда запуска выполнена успешно"
    ) else (
        call :log "ОШИБКА: Не удалось найти исполняемый файл ZennoPoster"
        echo Не удалось найти исполняемый файл ZennoPoster.
    )
   
    rem Удаляем временный файл
    if exist "!temp_file!" del "!temp_file!"
    call :log "Временный файл удалён"
    call :log "Функция :start_zennoposter - завершение выполнения"
    goto :eof

rem ============================================
rem Функция проверки памяти
rem ============================================
:check_memory
    call :log "Функция :check_memory - начало выполнения"
   
    rem Получаем общий объем оперативной памяти и свободную память
    call :log "Получение информации об объеме памяти через WMIC..."
    for /f "skip=1 tokens=2 delims==" %%a in ('wmic OS get TotalVisibleMemorySize /value') do (
        set "total_mem_raw=%%a"
        set "total_mem_raw=!total_mem_raw: =!"
        if defined total_mem_raw set /a total_mem=!total_mem_raw!
    )
   
    for /f "skip=1 tokens=2 delims==" %%a in ('wmic OS get FreePhysicalMemory /value') do (
        set "free_mem_raw=%%a"
        set "free_mem_raw=!free_mem_raw: =!"
        if defined free_mem_raw set /a free_mem=!free_mem_raw!
    )
   
    call :log "Получено: total_mem=!total_mem! KB, free_mem=!free_mem! KB"
   
    rem Проверяем корректность полученных данных
    if not defined total_mem (
        call :log "ОШИБКА: не удалось получить общий объем памяти"
        echo Ошибка: не удалось получить общий объем памяти
        exit /b 0
    )
    if not defined free_mem (
        call :log "ОШИБКА: не удалось получить объем свободной памяти"
        echo Ошибка: не удалось получить объем свободной памяти
        exit /b 0
    )
    if !total_mem! lss 1 (
        call :log "ОШИБКА: некорректное значение общей памяти"
        echo Ошибка: некорректное значение общей памяти
        exit /b 0
    )
   
    call :log "Данные корректны, начало расчётов..."
   
    rem Вычисляем использованную память
    set /a used_mem=total_mem-free_mem
   
    rem Переводим в МБ для избежания переполнения при вычислении процента
    set /a total_mem_mb=total_mem/1024
    set /a used_mem_mb=used_mem/1024
   
    call :log "Конвертация в MB: total=!total_mem_mb! MB, used=!used_mem_mb! MB"
   
    rem Вычисляем процент использования памяти
    set /a mem_usage=(used_mem_mb*100)/total_mem_mb
   
    call :log "Рассчитан процент использования памяти: !mem_usage!%%"
    echo Использование памяти: !mem_usage!%% (используется !used_mem_mb! MB из !total_mem_mb! MB)
    call :log "Использование памяти: !mem_usage!%% (используется !used_mem_mb! MB из !total_mem_mb! MB)"
   
    rem Проверяем, превышен ли порог
    if !mem_usage! gtr !MEMORY_THRESHOLD! (
        call :log "Порог !MEMORY_THRESHOLD!%% ПРЕВЫШЕН (текущее: !mem_usage!%%)"
        call :log "Функция :check_memory - возврат кода 1 (превышение порога)"
        exit /b 1
    ) else (
        call :log "Порог !MEMORY_THRESHOLD!%% НЕ превышен (текущее: !mem_usage!%%)"
        call :log "Функция :check_memory - возврат кода 0 (норма)"
        exit /b 0
    )

rem ============================================
rem Функция сравнения версий
rem ============================================
:compare_version
    setlocal EnableDelayedExpansion
    set "ver1=%~1"
    set "ver2=%~2"
   
    for /F "tokens=1-4 delims=." %%a in ("!ver1!") do (
        set /a v1=%%a, v2=%%b, v3=%%c, v4=%%d
    )
   
    for /F "tokens=1-4 delims=." %%a in ("!ver2!") do (
        set /a w1=%%a, w2=%%b, w3=%%c, w4=%%d
    )
   
    if !v1! gtr !w1! exit /b 1
    if !v1! lss !w1! exit /b -1
    if !v2! gtr !w2! exit /b 1
    if !v2! lss !w2! exit /b -1
    if !v3! gtr !w3! exit /b 1
    if !v3! lss !w3! exit /b -1
    if !v4! gtr !w4! exit /b 1
    if !v4! lss !w4! exit /b -1
    exit /b 0

:end_script
call :log "Завершение работы скрипта"
call :log "=========================================="
call :log ""
echo.
echo Окно закроется через 5 секунд...
timeout /t 5 /nobreak > nul
endlocal
exit /b

rem ============================================
rem Функция логирования
rem ============================================
:log
    setlocal enabledelayedexpansion
    set "message=%~1"
   
    rem Получаем текущую дату и время
    for /f "tokens=1-4 delims=/ " %%a in ('date /t') do (
        set "log_date=%%a.%%b.%%c"
    )
    for /f "tokens=1-2 delims=: " %%a in ('time /t') do (
        set "log_time=%%a:%%b"
    )
   
    rem Записываем в лог-файл
    echo [%log_date% %log_time%] %message% >> "%LOG_FILE%"
   
    endlocal
    goto :eof
Хорошая работа, искрение спасибо за идею.
 
Регистрация
26.05.2020
Сообщения
552
Благодарностей
193
Баллы
43
Я в слабые места шаблона добавляю такой сишарп-сниппет:

C#-сниппет для выхода при нехватке памяти:
// Получаем рабочий набор памяти процесса (фактическая используемая память)
var currentProcess = System.Diagnostics.Process.GetCurrentProcess();
long instanceMemoryMB = currentProcess.WorkingSet64 / (1024 * 1024);

// Получаем данные о памяти через командную строку
var processInfo = new System.Diagnostics.ProcessStartInfo("cmd", "/c wmic OS get TotalVisibleMemorySize,FreePhysicalMemory /Value");
processInfo.RedirectStandardOutput = true;
processInfo.UseShellExecute = false;
processInfo.CreateNoWindow = true;

var process = System.Diagnostics.Process.Start(processInfo);
string output = process.StandardOutput.ReadToEnd();
process.WaitForExit();

// Парсим вывод
long totalMemoryKB = 0;
long freeMemoryKB = 0;

foreach (var line in output.Split(new[] { '\n', '\r' }, System.StringSplitOptions.RemoveEmptyEntries))
{
    if (line.StartsWith("TotalVisibleMemorySize="))
        totalMemoryKB = long.Parse(line.Split('=')[1].Trim());
    else if (line.StartsWith("FreePhysicalMemory="))
        freeMemoryKB = long.Parse(line.Split('=')[1].Trim());
}

long totalMemoryMB = totalMemoryKB / 1024;
long freeMemoryMB = freeMemoryKB / 1024;

// Выводим текущую информацию в лог
project.SendWarningToLog(
    string.Format("Память процесса: {0} МБ | Всего памяти: {1} МБ | Свободно: {2} МБ",
    instanceMemoryMB, totalMemoryMB, freeMemoryMB), true
);

// Проверка: свободной памяти меньше 100 МБ
if (freeMemoryMB < 100)
{
    project.SendErrorToLog(
        "Выход по красной ветке: свободной памяти менее 100 МБ.", true
    );
    throw new Exception("Выход по ошибке");
}
На красную ветку повешал завершающий проект сниппет с кодом, добавляющим 1 выполнение (перезапуск):

+1 выполнение проекта:
    var id = Guid.Parse(project.TaskId);
    ZennoPoster.AddTries(id, 1);
Но это не отменяет того, что у некоторых моих клиентов некоторые проекты просто останавливаются на рандомном шаге спустя какое-то время работы. Просто в логе условно после кубика "взять строку" (как пример, это может быть любой другой кубик) из списка происходит останов проекта без останова - последняя строка в логе "Взяли строку..." и все, дальше ничего... При этом ресурсы проца и памяти еще в наличии... Кто-нибудь сталкивался с подобным поведением зенки?
 
Последнее редактирование:
  • Спасибо
Реакции: Sergodjan

Кто просматривает тему: (Всего: 1, Пользователи: 0, Гости: 1)