определить имя исполняемого скрипта из самого скрипта

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

Приветствую любителей скриптов !

Вопросик маленький - кто-нибудь знает как можно из исполняемого скрипта получить в переменную имя этого скрипта ?
Понимаю, что из /system script job надо выдергивать, но сразу приходит мысль, что там может оказаться несколько имен текущих исполняемых системой в данный момент скриптов ...


фрагменты скриптов, готовые работы, статьи, полезные приемы, ссылки
viewtopic.php?f=14&t=13947
Sertik
Сообщения: 1598
Зарегистрирован: 15 сен 2017, 09:03

Сам спросил, сам ответил. Похоже этого вообще нельзя сделать ибо /system script job не содержит имён исполняемых скриптов ! Вот уж не ожидал от Микротика ... тупо сделано. :ny_tik: а могли бы ...

Может по другому как можно ?


фрагменты скриптов, готовые работы, статьи, полезные приемы, ссылки
viewtopic.php?f=14&t=13947
Аватара пользователя
podarok66
Модератор
Сообщения: 4355
Зарегистрирован: 11 фев 2012, 18:49
Откуда: МО

Чё эта? у меня вроде как получилось взять. Хотя не факт, ведь действительно работать же может несколько сразу...

Код: Выделить всё

:log info "1";
:delay 5;
:local tre [/system script job get [find script!=""] script]
:log info "$tre";
:log info "Script stop"
P.S.: Пришла в голову идея. Для данного скрипта - создаём отдельного юзера и от его имени запускаем скрипт, имя юзера будет уникальным признаком скрипта, следовательно имя скрипта можно определить безошибочно :-)


Мануалы изучил и нигде не ошибся? Фаервол отключил? Очереди погасил? Витая пара проверена? ... Тогда Netinstal'ом железку прошей и настрой ее заново. Что, все равно не фурычит? Тогда к нам. Если не подскажем, хоть посочувствуем...
Sertik
Сообщения: 1598
Зарегистрирован: 15 сен 2017, 09:03

Уже по идее очень неплохо. Но как то с этим не сталкивался. А как запустить скрипт от имени конкретного юзера ? В смысле из планировщика ... (простите за наглость такую с моей стороны) ... :-) Если мне надо чтобы он по расписанию исполнялся ? Он от того же usera будет Планировщиком запущен ?


фрагменты скриптов, готовые работы, статьи, полезные приемы, ссылки
viewtopic.php?f=14&t=13947
Sertik
Сообщения: 1598
Зарегистрирован: 15 сен 2017, 09:03

По Вашей подсказке вот так работает. Создаем юзера Username. Заходим под ним в winbox (или через telnet и терминал). Создаем скрипт (имя произвольное естественно). Выходим. Заходим снова под своим обычным доступом (админским, допустим).

Исполняем код:

Код: Выделить всё

:log info "1";
:delay 5;
:local tre [/system script job get [find owner ="Username"] script]
:log info "$tre";
:log info "Script stop"
В $tre получаем имя исполненного скрипта.
:bra_vo: Podarok66 !

Но ! скрипт такой должен быть создан "из-под" уникального юзера. Если одновременно в job окажутся два таких, то будет косяк разумеется, find его тогда не сможет найти (в списке будет два одинаковых).

Также не понятно мне пока как всё это будет работать из под Планировщика. Задание в планировщике на исполнение этого скрипта тоже видимо должно быть создано тем же уникальным юзером ...

Немного "гиморное" решение, но оригинальное. Интересно, может как-то ещё можно ?


фрагменты скриптов, готовые работы, статьи, полезные приемы, ссылки
viewtopic.php?f=14&t=13947
Аватара пользователя
podarok66
Модератор
Сообщения: 4355
Зарегистрирован: 11 фев 2012, 18:49
Откуда: МО

Я с самого начала понимал про "костыльность" этого варианта. Но пока другого не вижу...


Мануалы изучил и нигде не ошибся? Фаервол отключил? Очереди погасил? Витая пара проверена? ... Тогда Netinstal'ом железку прошей и настрой ее заново. Что, все равно не фурычит? Тогда к нам. Если не подскажем, хоть посочувствуем...
yalta
Сообщения: 4
Зарегистрирован: 14 мар 2019, 22:28

Позволю свою ремарку.
Возникла задача - закрывать ранее запущенный экземпляр скрипта, при старте нового.
Загвоздка в отсутствии имени в jobs и в невозможности из идентификаторов выделить идентификатор текущего скрипта, - странно, но...
Предлагаемое решение, немедленно при старте "нашего" скрипта, формирует массив идентификаторов всех запущенных скриптов. Фокус в том, что идентификатор в последнем элементе массива и является идентификатором "нашего" скрипта. Выбираем его, восстанавливаем имя, далее.... хотя, imho далее и так очевидно.

Код: Выделить всё

:local arrIdScr [:toarray [/system script job find where script~"[a-zA-Z0-9]{1,}"]]
# определяем имя настоящего скрипта по последнему в массиве идентификатору
:local ScriptName [/system script job get ($arrIdScr->([:len $arrIdScr]-1)) value-name=script]
# формируем массив идентификаторов, соответствующих имени
:set $arrIdScr [/system script job find script=$ScriptName]
# "откусываем" id нашего скрипта
:set $arrIdScr [:pick $arrIdScr 0 ([:len $arrIdScr]-1)]
# цикл удаления копий скрипта за исключением выше "откушенного"
:foreach i in=$arrIdScr do={
/system script job remove $i
# :log warning "removed: $i"
}
:while (true) do={ :delay 5 }
Вставляем в скрипт с любым именем. Чтобы набрать некоторое количество запущенных копий - достаточно закомментировать строку /system script job remove и кликнуть на скрипт несколько раз. Затем - раскомментируем и исполняем ещё раз. Проверяем результат.
Для исключения добавления в начальный массив фоновых процессов "без имени", выставляющих свой идентификатор - использовал regex.


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

Значит скрипт может определить своё имя вот так:

# скрипт определяет своё имя.

:local arrIdScr [:toarray [/system script job find where script~"[a-zA-Z0-9]{1,}"]]
:local ScriptName [/system script job get ($arrIdScr->([:len $arrIdScr]-1)) value-name=script]
:log warning $ScriptName

Спасибо Вам yalta ! Пригодится.


фрагменты скриптов, готовые работы, статьи, полезные приемы, ссылки
viewtopic.php?f=14&t=13947
-13-
Сообщения: 124
Зарегистрирован: 18 мар 2021, 12:45

На dhcp-client, на интерфейс от провайдера можно повесить скрипт

Код: Выделить всё

/ip route set [find comment="ISP2"] gateway=($"gateway-address") disabled=no
где переменная ($"gateway-address"), берется из закладки status, хотя она называется везде "gateway".


Может и скрипты такие переменные содержат, просто мы не знаем как они пишутся...
Ну что то, типа такого...

Код: Выделить всё

/interface l2tp-client set [find comment="test"] name=($"script-name")


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

Решение этой задачи Rextended:
# нужно сделать уникальную метку в теле самого скрипта и потом по ней определить имя скрипта !

:local UniqueScriptID "QnJhdm8h"
:local ThisScriptName [/system script get ([find where source~"$UniqueScriptID"]->0) name]
:put $ThisScriptName


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