Каталог решений - Мониторинг свободного места на диске с помощью OneScript

Мониторинг свободного места на диске с помощью OneScript

Мониторинг свободного места на диске с помощью OneScript

В наличии

Скрипт, который проверяет объем свободного места на каждом диске и оповещает на почту о нехватке места.

Категория:

Описание

Проблема: на сервере в любой непредсказуемый момент заканчивается место на диске, происходят сбои, процессы останавливаются.

Задача: настроить оперативное оповещение на почту, если свободного места на диске осталось меньше 5 Гб.

Решение

1) Устанавливаем OneScript (или можно скачать и распаковать портативную версию): https://oscript.io/

2) В командной строке устанавливаем библиотеку для работы с почтой:

  opm install InternetMail

3) Создаем файл FreeDiskSpace.os и правим под свою специфику

  #Использовать InternetMail
  
  Функция ОтправитьПисьмо(Тема, Текст, МассивВложений) 
  	Пользователь = "test@mail.ru";
  	Пароль = "12345WWWeee";
  	Профиль = Новый ИнтернетПочтовыйПрофиль;
  	Профиль.АдресСервераSMTP    = "smtp.mail.ru";
  	Профиль.ПользовательSMTP    = Пользователь;
  	Профиль.ПарольSMTP          = Пароль;
  	Профиль.ИспользоватьSSLSMTP = Истина;
  	Профиль.АдресСервераIMAP    = "imap.mail.ru";
  	Профиль.ИспользоватьSSLIMAP = Истина;
  	Профиль.Пользователь = Пользователь;
  	Профиль.Пароль = Пароль;
  	Сообщение = Новый ИнтернетПочтовоеСообщение;
  	Сообщение.Получатели.Добавить("admin1@domain.ru");
  	Сообщение.ОбратныйАдрес.Добавить("admin1@domain.ru");
  	Сообщение.Отправитель = Пользователь;
  	Сообщение.Тема = Тема;
  	Сообщение.Тексты.Добавить(Текст, ТипТекстаПочтовогоСообщения.HTML);
  	Для Каждого Влож Из МассивВложений Цикл
  		Сообщение.Вложения.Добавить(Влож);
  	КонецЦикла;
  	Почта = Новый ИнтернетПочта;
  	Почта.Подключиться(Профиль, ПротоколИнтернетПочты.POP3);
  	Почта.Послать(Сообщение, , ПротоколИнтернетПочты.SMTP);
  КонецФункции
  
  Функция ОбъемСвободноГб(БукваДиска)
  	ид = Новый ИнформацияОДиске(БукваДиска);
  	ДоступноБайт = ид.Доступно;
  	ДоступноКб = ДоступноБайт / 1024;
  	ДоступноМб = ДоступноКб / 1024;
  	ДоступноГб = ДоступноМб / 1024;
  	Возврат ДоступноГб;
  КонецФункции
  
  Функция ТемаСОбъемомДиска(Тема, БукваДиска, ДоступноГб, МинОбъемГб)
  	Тема2 = Тема;
  	Если ДоступноГб < МинОбъемГб Тогда 
  		сДоступноГб = Строка(ОКР(ДоступноГб));
  		Тема2 = Тема + БукваДиска + "=" + сДоступноГб + " Гб; ";		
  	КонецЕсли;
  	Возврат Тема2;
  КонецФункции
  
  Функция ТекстСообщенияСвободноНаДиске(БукваДиска, ДоступноГб)
  	тСообщ = Строка(ТекущаяДата()) + " На диске '" + БукваДиска +"' свободно " + Строка(ОКР(ДоступноГб)) + " Гб.";
  	Возврат тСообщ;
  КонецФункции
  
  Попытка	
  	МинОбъемГб = 5;
  	КоличествоДнейХраненияЛогов = 2;
  	Тема = "Dev windows2016 Мало места на дисках: ";
  	Текст = "На дисках меньше " + Строка(МинОбъемГб) + " Гб. Освободите занятое пространство. На каждом диске должно быть свободного места больше " + Строка(МинОбъемГб) + " Гб.";
  	ТекДата = ТекущаяДата();
  	МинДатаИзмененияФайла = ТекДата - КоличествоДнейХраненияЛогов*60*60*24;
  	тЛог = "";
  	МассивВложений = Новый Массив; 
  	
  	сТекДата = Строка(ТекДата);
  	сТекДата = СтрЗаменить(сТекДата, Символы.НПП, "");
  	сТекДата = СтрЗаменить(сТекДата, ":", ".");
  	сТекДата = СтрЗаменить(сТекДата, " ", "_");
  	чДень = День(ТекДата);
  	чГод = Год(ТекДата);
  	чМес = Месяц(ТекДата);
  	сГод = СтрЗаменить(Строка(чГод), Символы.НПП, "");
  	сМес = ?(чМес > 9, Строка(чМес), "0"+Строка(чМес));
  	сДень = ?(чДень > 9, Строка(чДень), "0"+Строка(чДень));
  	КаталогЛогов = "C:\LOGS\" + сГод + "\" + сМес + "\";
  	СоздатьКаталог(КаталогЛогов);
  	ИмяЛогаПроверки = КаталогЛогов + "FreeDiskSpace_" + сТекДата + ".txt";
  	ЛогУд = Новый ЗаписьТекста(ИмяЛогаПроверки, КодировкаТекста.UTF8);
  	
  	СДоступноГб = ОбъемСвободноГб("C");
  	ДДоступноГб = ОбъемСвободноГб("D");
  	
  	Тема = ТемаСОбъемомДиска(Тема, "C", СДоступноГб, МинОбъемГб);
  	Тема = ТемаСОбъемомДиска(Тема, "D", ДДоступноГб, МинОбъемГб);
  	
  	тСообщ = ТекстСообщенияСвободноНаДиске("C", СДоступноГб);
  	ЛогУд.ЗаписатьСтроку(тСообщ);
  	тЛог = тСообщ;
  	тСообщ = ТекстСообщенияСвободноНаДиске("D", ДДоступноГб);
  	ЛогУд.ЗаписатьСтроку(тСообщ);
  	тЛог = тЛог + Символы.ПС + тСообщ;
  	
  	МасФ = НайтиФайлы(КаталогЛогов, "*.*");
  	Для Каждого Ф ИЗ МасФ Цикл
  		ДатаФайла = Ф.ПолучитьВремяИзменения();
  		Если ДатаФайла < МинДатаИзмененияФайла Тогда
  			тСообщ = Строка(ТекущаяДата()) + " Удаляется файл '" + Ф.ПолноеИмя + "', так как дата изменения='" + Строка(ДатаФайла) + "' < '" + Строка(МинДатаИзмененияФайла) + "'.";
  			ЛогУд.ЗаписатьСтроку(тСообщ);
  			УдалитьФайлы(Ф.ПолноеИмя);
  		Иначе
  			тСообщ = Строка(ТекущаяДата()) + " Остается файл '" + Ф.ПолноеИмя + "', так как дата изменения='" + Строка(ДатаФайла) + "' >= '" + Строка(МинДатаИзмененияФайла) + "'.";
  			ЛогУд.ЗаписатьСтроку(тСообщ);
  		КонецЕсли;
  	КонецЦикла;
  	
  	Если СДоступноГб < МинОбъемГб ИЛИ ДДоступноГб < МинОбъемГб Тогда 
  		ЛогУд.ЗаписатьСтроку(Текст);
  		ЛогУд.Закрыть();
  		Текст = тЛог + Символы.ПС + Текст;				
  		МассивВложений.Добавить(ИмяЛогаПроверки);
  		ОтправитьПисьмо(Тема, Текст, МассивВложений);
  	Иначе
  		тСообщ = "На дисках более " + Строка(МинОбъемГб) + " Гб, поэтому считается, что все в порядке.";
  		ЛогУд.ЗаписатьСтроку(тСообщ);
  	КонецЕсли;
  	
  Исключение
  		ОписОш = ОписаниеОшибки();
  		тСообщ = "Скрипт остановился раньше, работа прервана. Проверьте работу скрипта.";
  		тСообщ = тСообщ + Символы.ПС + "Ошибки: " + Символы.ПС + ОписОш;		
  		Сообщить(тСообщ);
  		ЛогУд.ЗаписатьСтроку(тСообщ);
  		ЛогУд.Закрыть();
  		МассивВложений.Добавить(ИмяЛогаПроверки);
  		Тема = Тема + " - есть ошибки выполнения скрипта!";	
  		ОтправитьПисьмо(Тема, тСообщ, МассивВложений);
  КонецПопытки;

3) Создаем файл FreeDiskSpace.bat
 

  "C:\Program Files\OneScript\bin\oscript.exe" "C:\Scripts\os\FreeDiskSpace.os"

4) Файл FreeDiskSpace.bat добавляем в планировщик заданий, например, с расписанием выполнения "Каждый час".

Таким образом задача решена.

Особенности: скрипт ведет лог своих операций на случай каких-либо непредсказуемых сбоев, если что-то пойдет иначе и потребуется быстро узнать причину ошибки.

Ограничения

Конечно, если диск заполнится раньше часа, то мониторинг не поможет, но такие ситуации должны решаться иначе: т.е. свободного дискового запаса должно хватать на достаточно длительное время.

has been added to your cart:
Оформление заказа