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

Здесь выкладываем скрипты
Правила форума
Уважаемые Пользователи форума, обратите внимание!
Ни при каких обстоятельствах, Администрация форума, не несёт ответственности за какой-либо, прямой или косвенный, ущерб причиненный в результате использования материалов, взятых на этом Сайте или на любом другом сайте, на который имеется гиперссылка с данного Сайта. Возникновение неисправностей, потерю программ или данных в Ваших устройствах, даже если Администрация будет явно поставлена в известность о возможности такого ущерба.
Просим Вас быть предельно осторожными и внимательными, в использовании материалов раздела. Учитывать не только Ваши пожелания, но и границы возможностей вашего оборудования.
Ответить
Sertik
Сообщения: 1601
Зарегистрирован: 15 сен 2017, 09:03

Приветствую всех !

Столкнулся со странным багом в работе скриптов и Планировщика Микротик.
Заключается оно в том, что если скрипт или задание в Планировщике, вызывает какую-либо функцию более чем один раз - например дважды подряд, то на самом деле она вызывается заданное число раз +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 - без проверки на пустое имя выполняется ошибочное количество раз. Похоже настоящий косяк разработчиков.

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


фрагменты скриптов, готовые работы, статьи, полезные приемы, ссылки
viewtopic.php?f=14&t=13947
pepelxl
Сообщения: 161
Зарегистрирован: 23 июл 2013, 18:47

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


Sertik
Сообщения: 1601
Зарегистрирован: 15 сен 2017, 09:03

Накатал кляузу в саппорт Микротика и аналогичное сообщение на англоязычный форум 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.


фрагменты скриптов, готовые работы, статьи, полезные приемы, ссылки
viewtopic.php?f=14&t=13947
Ответить