Страница 1 из 1

странное поведение Рос Микротик при повторном вызове функций

Добавлено: 28 окт 2020, 19:36
Sertik
Приветствую всех !

Столкнулся со странным багом в работе скриптов и Планировщика Микротик.
Заключается оно в том, что если скрипт или задание в Планировщике, вызывает какую-либо функцию более чем один раз - например дважды подряд, то на самом деле она вызывается заданное число раз +1 (то есть в нашем случае трижды).
Проверить это можно следующим образом:

1. создадим тестовую функцию FuncTest печатающую в лог сколько раз она отработала, сохраняя также количество её вызовов в глобальной переменной FuncTestCount

:global FuncTest do={
:global FuncTestCount
:set FuncTestCount ($FuncTestCount+1)
:log warning ("proverka "."$FuncTestCount")
}

Теперь создадим задание в Планировщике (или второй скрипт) с однократным выполнением и вот с таким содержанием:

:global FuncTest
[$FuncTest]
[$FuncTest]

Как видно тестовая функция вызывается дважды.

Но, посмотрите в лог ! Вы увидите, что она отработала трижды !

Самое интересное, что последний ошибочный раз кто-то вызывает функцию, не передавая ей параметров (если таковые предусмотрены). Также функция не получает в известном параметре $0 своего имени (оно пустое).

Таким образом, слава богу ! можно обойти этот косяк Рос следующим образом - добавляем в саму функцию проверку на наличие параметра $0. Если его нет - это и есть ошибочный вызов - просто ничего не делаем.

Вот так перепишем нашу тестовую функцию:

:global FuncTest do={
:if ([:len $0]=!0) do={
:global FuncTestCount
:set FuncTestCount ($FuncTestCount+1)
:log warning ("proverka "."$FuncTestCount")
}
}

Тогда она будет вызываться столько раз сколько указано. Получается, что такую проверку нужно вставлять во все функции. Не знаю, зависит ли это от того, выполнялись ли какие-нибудь команды между вызовами. Пробовал вставлять некоторые команды и паузу типа :delay 5s - без проверки на пустое имя выполняется ошибочное количество раз. Похоже настоящий косяк разработчиков.

Жду комментариев знатоков. Надеюсь кому-то пригодится. Наступил на эти грабли, когда никак не мог понять, почему вызываю свою функцию три раза, а она выполняется четыре !

Re: странное поведение Рос Микротик при повторном вызове функций

Добавлено: 29 окт 2020, 09:27
pepelxl
да, похоже на глюк.
добавлю - только второй вызов функции приводит к повторному вызову, третий и последующие отрабатывают нормально.

Re: странное поведение Рос Микротик при повторном вызове функций

Добавлено: 06 ноя 2020, 17:03
Sertik
Накатал кляузу в саппорт Микротика и аналогичное сообщение на англоязычный форум https://forum.mikrotik.com/viewtopic.php?f=9&t=168561
На форуме тишина пока, а вот саппорт ответил.

Вот официальный ответ после того как сообразили наконец о чём идет речь:

Hello,

Thank you for the report!

We have managed to reproduce the issue locally in our labs and look forward to fixing it on upcoming RouterOS versions, unfortunately, I cannot provide an ETA now.

Best regards,
Oskars K.