пїЅпїЅпїЅпїЅпїЅпїЅпїЅпїЅпїЅпїЅпїЅпїЅпїЅ пїЅпїЅпїЅпїЅ пїЅпїЅпїЅпїЅпїЅпїЅ
Слишком длинный поисковый запрос.
По вашему запросу ничего не найдено :(
Убедитесь, что запрос написан правильно, или посмотрите другие
наши статьи:
В версиях Asterisk начиная с версии 1.4 периодически наблюдались проблемы с утечкой памяти, которые лечились с помощью перезагрузки сервера. Так как никто не застрахован от вероятных неизвестных багов, лучше для перестраховки перезагружать сервер IP - АТС раз в неделю (или чаще) с помощью скрипта. В статье расскажем про создание bash скрипта и его настройку в cron.
Скрипт перезагрузки
По факту, в скрипте достаточно одной команды перезагрузки. Сделаем немного информативной нагрузки – добавим запись в лог – файл: мы будем записывать дату и время ребута с лог – файл. Итак, создаем файл reboot.sh:
[root@asterisk ~]# touch reboot.sh
Далее открываем этот файл для редактирования через vim редактор:
[root@asterisk ~]# vim reboot.sh
Открыв файл, нажмите «О» для редактирования. Вставьте код, указанный ниже:
#!/bin/sh
LOGFILE=/home/admin/log_mail.txt
DATE="`date +%d.%m.%Y" "%H:%M:%S`"
echo "REBOOT :: $DATE :: Reboot is in progress" >> "$LOGFILE"
shutdown -r now
После этого нажимаем комбинацию «:x!» для сохранения конфигурации. В данном скрипте:
LOGFILE - переменная, которая указывает на лог – файл;
DATE - записываем дату и время в указанную переменную;
echo "…" - записываем в лог – файл отметку о перезагрузке;
shutdown -r now - команда перезагрузки сервера;
Получаем простенький скрипт для осуществления перезагрузки. Осталось только сделать его работу по расписанию. Для этого, мы воспользуемся планировщиком cron:
* * * * * команда для выполнения
- - - - -
| | | | |
| | | | +----- день недели (0 - 6) (Воскресенье=0)
| | | +------- месяц (1 - 12)
| | +--------- день месяца (1 - 31)
| +----------- час (0 - 23)
+------------- минута (0 - 59)
Зашедулим скрипт на выполнение каждую полночь в воскресение. Для этого, открываем для редактирования crontab файл:
[root@asterisk ~]# crontab -e
В открывшийся файл добавляем:
0 0 * * 0 /bin/bash /home/reboot.sh >/dev/null
Где /home/reboot.sh - полный путь к скрипту перезагрузки сервера. Нажимаем F2 и далее Yes. Задача на выполнение сохранена.
Примеры планирования в cron
Разберем пару примеров того, по какому расписанию можно планировать выполнение скрипта:
15 0 1 1,3,6,9,12 * - выполнение скрипта каждое 1 число января, марта, июня, сентября и декабря в 00:15 ночи;
0 20 * 8 1-5 - выполнение скрипта каждый будний день в 20:00 в августе;
0 0 1,15,25 * * - выполнение скрипта в полночь каждого месяца первого, пятнадцатого и двадцать пятого числа;
Если вы только начинаете своё знакомство с IP-АТС Asterisk и графическим интерфейсом FreePBX, может случиться так, что ваша АТС забанит вас по IP и восстановить доступ вы сможете только через консоль самого сервера или виртуальной машины. Знакомо? Тогда читай что делать в таком случае!
По умолчанию во FreePBX работает встроенная защита сервера от взлома пароля методом “грубого перебора”, известного в простонародье как брутфорс (bruteforce). Этот механизм называется fail2ban и предназначен он для того, чтобы ограничивать возможным злоумышленникам доступ к компонентам сервера.
В случае с FreePBX может случиться ситуация, когда сервер примет вас за возможного злоумышленника и ограничит вам доступ по SSH (порт по умолчанию 22). Представьте - вы только установили FreePBX, зашли в web-интерфейс начали проводить настройки, но тут вам понадобилась консоль сервера. Вы открываете putty, вводите адрес и порт сервера, затем логин, а потом пароль. Сервер отвечает, что пароль не правильный Access denied. “Неправильно ввёл, с кем не бывает” – подумаете вы и повторите попытку. Так вот если вы 5 раз неправильно введёте пароль, то на шестой увидите следующую картину при попытке подключиться к серверу:
Данная статья описывает ситуацию, которая может случиться на тестовых системах или же - на свежих системах, которые установлены недавно. Команда Мерион Нетворкс ни при каких условиях не рекомендует использовать советы из данной статьи на системах, работающих в Production режиме... Никогда.
Однако! Если у вас остался доступ к вэб интерфейсу FreePBX, то ещё не всё потеряно. Начиная с версии 13, во FreePBX появился модуль Firewall, который как раз и отвечает за работу fail2ban. Поэтому, чтобы заново открыть себе доступ к серверу, мы этот модуль не на долго отключим. Для этого прыгаем в Connectivity → Firewall и жмём Disable Firewall:
Отлично, теперь, чтобы сервер нас больше не банил мы немного подредактируем настройки fail2ban. Для этого, опять подключаемся к серверу по SSH и редактируем файл /etc/fail2ban/jail.local любым текстовым редактором, например vim:
vim /etc/fail2ban/jail.local
Найдите секцию [DEFAULT] и добавьте в опцию ignoreip адрес, с которого вы подключаетесь к серверу. Адреса можно добавлять через пробел в одну строку, можно также добавлять целые сети.
После этого не забудьте заного включить Firewall. Connectivity → Firewall и жмём Enable Firewall
Если WEB - интерфейс доступен
Если доступ к WEB - интерфейсу FreePBX доступен, то просто зайдите в него, перейдите на Admin → System Admin → Intrusion Detection. В списке забаненных IP - адресов найдите нужный и удалите его. Можно это сделав, например, указав в разрешенном списке забаненный адрес с /32 маской, или подсеть. После этого нажмите Restart. Готово.
Перехват исключений в Python помогает уменьшить количество возникающих в программе сбоев. Таким образом, ваш код становится более надежным, а пользователям становится проще с ним работать. В этой статье я расскажу, как перехватывать несколько исключений в одном блоке
try/except
в Python.
1. Что такое исключения в Python?
В Python исключения – это механизм взаимодействия различных частей программы. Этот механизм позволяет одной части системы уведомлять о том, что она столкнулась с некой критической ошибкой и не знает, как с ней справиться.
В таком случае вызывается исключение. Другая часть программы, которая знает, как справиться с этой ошибкой, перехватывает это исключение и выполняет ее обработку надлежащим образом.
Если исключения не обработать, это может привести к сбою программы. Так что, обработка исключений позволяет уберечь вашу программу от сбоя и сделать ее более надежной.
Важность обработки нескольких исключений в Python
Это помогает избежать дублирования кода, так как несколько исключений обрабатываются одним и тем же блоком. Это также упрощает чтение, редактирование и удаление кода.
Кроме того, это помогает писать более эффективный код, так как тип ошибки нужно проверять не несколько, а лишь один раз.
2. Обработка нескольких исключений
Перехват нескольких исключений означает, что несколько исключений перехватываются одним и тем же блоком
except
. В Python вы можете перехватывать разные исключения отдельными блоками.
Или же, если вы хотите обрабатывать исключения вместе, вы можете обрабатывать их с помощью одного блока. Для этого вам нужно будет перехватить сразу несколько исключений. Здесь я расскажу и покажу на примере, как это можно сделать.
#1. Перехват разных исключений разными блоками
Допустим, что у нас есть программа, которая принимает на вход два различных числа и делит их друг на друга. В этой программе мы предполагаем, что, когда пользователь будет вводить недопустимые значения, будут возникать различные типы исключений. Так, в частности мы собираемся обрабатывать исключения
ValueError
и
ZeroDivisionError
.
Исключение
ValueError
будет вызываться тогда, когда пользователь будет вводить значение, которое невозможно преобразовать в целое число. А исключение
ZeroDivisionError
будет вызываться тогда, когда второе вводимое число будет равно нулю. И там, и там мы будем отображать сообщение об ошибке, которое гласит: «Вы ввели недопустимое значение» (You entered an invalid value).
Чтобы реализовать все, что мы описали выше, напишем следующий код:
try:
dividend = int(input('Enter first num: '))
divisor = int(input('Enter second num: '))
quotient = dividend / divisor
print(quotient)
except ValueError as e:
print("You entered an invalid value")
except ZeroDivisionError as e:
print("You entered an invalid value")
except Exception as e:
print("Something went wrong")
Если мы запустим этот код и введем текст, который нельзя преобразовать в целое число, то получим следующий результат:
Если же мы введем в качестве второго числа ноль, то получим вот такой результат:
Код работает ровно так, как мы и ожидали, но обратите внимание, что мы обрабатываем исключения
ValueError
и
ZeroDivisionError
одинаково. Получается, что мы практически дублируем блоки
except
. Это далеко от идеала, так как мы нарушаем один из принципов программирования – DRY (Don’t Repeat Yourself – Не повторяйся).
Так что, вместо того, чтобы писать два отдельных блока, мы можем объединить их в один, который будет перехватывать несколько исключений. Если мы это сделаем, то сможем избежать повторов.
#2. Перехват нескольких исключений в одном блоке
except
Для того, чтобы перехватить несколько исключений, мы выделяем кортеж, в котором указаны все ошибки, которые мы хотим перехватить. Вот пример, где мы перехватываем в одном блоке
except
два исключения -
ValueError
и
ZeroDivisionError:
try:
dividend = int(input('Enter first num: '))
divisor = int(input('Enter second num: '))
quotient = dividend / divisor
print(quotient)
except (ValueError, ZeroDivisionError) as e:
print("You entered an invalid value")
except Exception as e:
print("Something went wrong")
Эта реализация намного лучше, чем предыдущий код. По сути, это и есть обработка нескольких исключений. Код, который приведен выше, работает аналогично предыдущему. Так что, если вы тестируете его, используя предыдущие примеры, все должно работать как раньше:
#3. Определяем, какое исключение было перехвачено
Приведенный выше код выполняет первый блок
except
, когда обнаружена ошибка
ValueError
или
ZeroDivisionError
. В некоторых случаях возможно такое, что вы хотите выполнить какой-то код для обеих ошибок и какой-то еще код только для одной из них.
В таком случае для начала нужно определить, какая ошибка была перехвачена, после чего выполнить соответствующий код.
Для того, чтобы определить, какое исключение было перехвачено, вы можете добавить внутрь блока
except
блок
if/else
. Вот пример:
try:
dividend = int(input('Enter first num: '))
divisor = int(input('Enter second num: '))
quotient = dividend / divisor
print(quotient)
except (ValueError, ZeroDivisionError) as e:
print("You entered an invalid value")
if isinstance(e, ValueError):
print('Value Error')
else:
print('Zero Division Error')
except Exception as e:
print("Something went wrong")
Здесь, помимо того, что для
ValueError
и
ZeroDivisionError
мы печатаем сообщение об ошибке, мы также проверяем, ошибку какого типа мы обнаружили, и печатаем еще одно сообщение. Если мы запустим код еще раз, мы увидим дополнительное сообщение, касающееся перехваченного исключения.
3. Когда необходимо обрабатывать несколько исключений?
В общем случае обработка нескольких исключений идеально подходит, если вы хотите выполнить один и тот же код для похожих исключений, например,
Сетевые запросы, которые не удалось выполнить по разным причинам. Независимо от причины, вы можете уведомить пользователя о том, что сервер на данный момент недоступен.
Сбои соединения с базой данных, которые могут привести к ряду ошибок. И несмотря на то, что эти ошибки могут быть разными, принцип их обработки может быть одинаковый.
Файловый ввод-вывод также может вызывать ошибки, которые можно обрабатывать одинаково, например, ошибки прав доступа или ошибки записи на диск.
Заключение
В этой статье мы рассмотрели, как можно объединить несколько блоков
except
в один, одновременно перехватывая несколько исключений. Это может помочь вам сделать ваш код более читабельным и удобным в сопровождении.
