В процессе промышленной эксплуатации информационных баз 1С системные администраторы и разработчики нередко сталкиваются с ситуацией, когда регламентные задания перестают выполняться по расписанию или зависают в состоянии бесконечного выполнения. Перезапуск службы ragent решает проблему, однако в разгар рабочего дня остановка всего сервера 1С приводит к обрыву сеансов сотен пользователей. Разберем по шагам, как локализовать и устранить зависание сервиса фоновых заданий без прерывания работы пользователей.
Прежде чем приступать к низкоуровневым операциям с процессами, выясним причину остановки заданий на уровне конфигурации и кластера. Нередко выполнение расписания блокируется регламентными процедурами обслуживания или действиями администраторов.
Использование, запишем изменения, а затем снова включим и сохраним. Это действие сбрасывает зависшую внутреннюю очередь планировщика для конкретной задачи.Если конкретное фоновое задание зависло наглухо и удерживает рабочий процесс, можно принудительно завершить только проблемный процесс rphost, не разрывая работу остальных пользователей. Рассмотрим подробнее, как безопасно выполнить миграцию сеансов:
rphost) и зафиксируем его сетевой порт и системный идентификатор (PID).rphost.exe (или rphost в Linux) с ранее зафиксированным PID и принудительно завершаем его. Зависшее фоновое задание перейдет в статус ошибки или отмены.Часто причиной зависания фонового задания становятся длительные блокировки или ожидание внешнего ресурса на уровне базы данных. В этом случае прервать зависшую транзакцию можно напрямую в СУБД:
Для Microsoft SQL Server выполняем команду:
KILL 125; -- где 125 - SPID зависшего соединения
Для PostgreSQL используем системную функцию:
SELECT pg_terminate_backend(14820); -- где 14820 - PID процесса СУБД
После снятия блокировки в СУБД сеанс 1С завершится аварийно, освободит ресурсы кластера и позволит следующим заданиям запуститься в штатном режиме.
Если планировщик кластера полностью перестал обрабатывать очередь, а перезагрузка службы невозможна до конца рабочего дня, организуем временный принудительный запуск критически важных заданий (например, обмена данными или закрытия кассовых смен).
Разберем пример создания внешней обработки, запускающей необходимое регламентное задание через обработчик ожидания клиентского приложения:
&НаКлиенте
Процедура ПриОткрытии(Отказ)
// Подключаем обработчик с интервалом запуска 300 секунд (5 минут)
ПодключитьОбработчикОжидания("ВыполнитьРегламентнуюПроцедуру", 300);
КонецПроцедуры
&НаКлиенте
Процедура ВыполнитьРегламентнуюПроцедуру()
ВыполнитьЗаданиеНаСервере();
КонецПроцедуры
&НаСервере
Процедура ВыполнитьЗаданиеНаСервере()
Задание = РегламентныеЗадания.НайтиПоНаименованию("ЗагрузкаДанных");
Если Задание <> Неопределено Тогда
// Запускаем фоновое задание вручную в обход внутреннего таймера
Задание.ВыполнитьРаботу();
КонецЕсли;
КонецПроцедуры
Также можно использовать запуск тонкого или толстого клиента в пакетном режиме через Планировщик задач операционной системы с передачей параметра командной строки /Execute <ПутьКОбработке>, где в модуле обработки после исполнения метода вызывается ЗавершитьРаботуСистемы().
Чтобы исключить деградацию сервиса фоновых заданий в дальнейшем, проанализируем параметры кластера и применим следующие превентивные настройки:
86400 секунд) и настроим Допустимый объем памяти. Кластер будет автоматически обновлять процессы rphost без влияния на работу пользователей.Сервис фоновых заданий и Сервис регламентных заданий, изолировав их от тяжелых интерактивных запросов пользователей.