Проблема: на сервере в любой непредсказуемый момент заканчивается место на диске, происходят сбои, процессы останавливаются.
Задача: настроить оперативное оповещение на почту, если свободного места на диске осталось меньше 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 добавляем в планировщик заданий, например, с расписанием выполнения "Каждый час".
Таким образом задача решена.
Особенности: скрипт ведет лог своих операций на случай каких-либо непредсказуемых сбоев, если что-то пойдет иначе и потребуется быстро узнать причину ошибки.
Ограничения
Конечно, если диск заполнится раньше часа, то мониторинг не поможет, но такие ситуации должны решаться иначе: т.е. свободного дискового запаса должно хватать на достаточно длительное время.