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

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

26 фев 2020, 00:12

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

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


Чего не знаем то нагуглим
Sertik
Сообщения: 1152
Зарегистрирован: 15 сен 2017, 09:03

26 фев 2020, 01:19

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

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


Чего не знаем то нагуглим
Аватара пользователя
podarok66
Модератор
Сообщения: 4085
Зарегистрирован: 11 фев 2012, 18:49
Откуда: МО

26 фев 2020, 20:58

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

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

: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
Сообщения: 1152
Зарегистрирован: 15 сен 2017, 09:03

27 фев 2020, 00:04

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


Чего не знаем то нагуглим
Sertik
Сообщения: 1152
Зарегистрирован: 15 сен 2017, 09:03

27 фев 2020, 00:38

По Вашей подсказке вот так работает. Создаем юзера 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 его тогда не сможет найти (в списке будет два одинаковых).

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

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


Чего не знаем то нагуглим
Аватара пользователя
podarok66
Модератор
Сообщения: 4085
Зарегистрирован: 11 фев 2012, 18:49
Откуда: МО

27 фев 2020, 09:30

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


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

17 сен 2021, 20:13

Позволю свою ремарку.
Возникла задача - закрывать ранее запущенный экземпляр скрипта, при старте нового.
Загвоздка в отсутствии имени в 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
Сообщения: 1152
Зарегистрирован: 15 сен 2017, 09:03

22 сен 2021, 13:04

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

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

: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 ! Пригодится.


Чего не знаем то нагуглим
Ответить