На bash мы можем заглянуть в диспетчер задач (ps) и найти процесс нашей программы, прежде чем ее запускать (здесь рассматривал). На Mikrotik же такого нету, приходится извращаться. Зачем это надо?, если один из экземпляров программы по какой то причине зависнет, а еще он использует глобальные переменные, то мы можем получить неожиданный результат, поэтому лучше избегать таких коллизий.
Сама идея проста - проверить некоторую глобальную переменную, которую создаем после проверки, но у Mikrotik свои заморочки и приходится изгаляться:
# ищем среди глобальных переменных. ошибки здесь не будет, либо "", либо id
# в отличии от поиска через get, там и ошибки, и "не моментальное заполнение" списка,
# т.е. первый экземпляр висит уже 10 сек, а переменные через get еще отсутствуют
:if ([/system script environment find where name=RunProgram]!="") do={
:log error ("There is another instance of the program running, exit")
:error message="There is another instance of the program running, exit"
}
# объявляем глобальную переменную
:global RunProgram true
...
...
...
# уничтожаем переменную
:set RunProgram
Есть более изящный вариант - проверка в текущих заданиях:
:local scriptname "MyScript"
:if ([:len [/system script job find script=$scriptname]] > 0) do={
:log error "There is another instance of the program running, exit"
:error message="There is another instance of the program running, exit"
}
Комментариев нет:
Отправить комментарий