Вход | Регистрация


Зависают сеансы пользователей на сервере 1С

Зависают сеансы пользователей на сервере 1С
Я
   AlexYurg
 
02.11.18 - 15:50
Зависают сеансы ушедших пользователей на сервере 1С.
Платформа 1С - 8.3.12.1567
Сервер 1С - x64
Сервер БД - PostgreSQL 9.1.9-1.1C(x64)
Настройки кластера: http://joxi.ru/J2bxe5WUXW80gr
Проблема появилась после какого-то очередного обновления версии 1С.
Поиск решения не дал вразумительных результатов.
Прошу совета!
 
 
   sergey198
 
1 - 02.11.18 - 15:52
(0)та же проблема на 8.3.12
   AlexYurg
 
2 - 02.11.18 - 15:59
(1) И что? Победили? Если да, то как, если нет, то почему?
   shuhard
 
3 - 02.11.18 - 16:03
(2)[если нет, то почему?]
пятнично
жши ещё
   spiller26
 
4 - 02.11.18 - 16:05
(0) Я выкидываю в полночь каждый день всех самописным фоновым заданием.
   AlexYurg
 
5 - 02.11.18 - 16:10
(4) Значит, у вас та же проблема?
Всегда была или тоже возникла с переходом на 8.3.12?
   spiller26
 
6 - 02.11.18 - 16:16
(5) В 8.3.10.2252 появилась, пол года боролся, потом решил написать фоновое.
   spiller26
 
7 - 02.11.18 - 16:17
(5) У нас сервак на Линуксе + Posgres + web-сервер на апаче.
   Вафель
 
8 - 02.11.18 - 16:18
параметр "интервал перезапуска" не рекомндуют заполнять.
лучше скрипт запускай по расписанию
   spiller26
 
9 - 02.11.18 - 16:23
(5) вот код моего регламентного.
Процедура УдалениеСеансовВНазначенноеВремя() Экспорт
    
    Успех = Истина;
    пИмяАдминистратораКластера = "";
    пПарольАдминистратораКластера = "";
    пИмяАдминистратораИнформационнойБазы = "";
    пПарольАдминистратораИнформационнойБазы = "";
    
    //параметры

    Попытка
        ВремяУдаленияСеансов = Константы.abtВремяУдаленияСеансов.Получить();
        ДатаУбийства = Дата(Год(ТекущаяДата()),Месяц(ТекущаяДата()),День(ТекущаяДата()), Час(ВремяУдаленияСеансов), Минута(ВремяУдаленияСеансов), Секунда(ВремяУдаленияСеансов)); 
        
        пАдресСервераАдминистрирования = "";
        пИмяИнформационнойБазыВКластере = "";
        //Порт Сервера Администрирования

        пПортСервераАдминистрирования = СокрЛП(Константы.abtПортСервераАдминистрирования.Получить());//"1545"

        пПортСервераАдминистрирования = ?(пПортСервераАдминистрирования = "", "1545", пПортСервераАдминистрирования);
        //Порт Кластера

        пПортКластера = СокрЛП(Константы.abtПортКластера.Получить());//"1541";

        пПортКластера = ?(пПортКластера = "", "1541", пПортКластера);
        //Имя Администратора Кластера

        пИмяАдминистратораКластера = СокрЛП(Константы.abtИмяАдминистратораКластера.Получить());
        //Пароль Администратора Кластера

        пПарольАдминистратораКластера = СокрЛП(Константы.abtПарольАдминистратораКластера.Получить());
        //Имя Администратора Информационной Базы

        ПользовательИнформационнойБазыРегламентныхЗаданий = Константы.abtПользовательИнформационнойБазыРегламентныхЗаданий.Получить();
        Если НЕ ПользовательИнформационнойБазыРегламентныхЗаданий = Справочники.Пользователи.ПустаяСсылка() Тогда
            ПользовательИБ = ПользователиИнформационнойБазы.НайтиПоУникальномуИдентификатору(ПользовательИнформационнойБазыРегламентныхЗаданий.ИдентификаторПользователяИБ);
            пИмяАдминистратораИнформационнойБазы = ?(ПользовательИБ = Неопределено, "", СокрЛП(ПользовательИБ.Имя));
        КонецЕсли;    
        //Пароль Администратора Информационной Базы

        пПарольАдминистратораИнформационнойБазы = СокрЛП(Константы.abtПарольПользователяИнформационнойБазыРегламентныхЗаданий.Получить());
    Исключение
        Успех = Ложь;
    КонецПопытки;    
    
    //Дополнительная проверка параметров для соединения к кластеру администрирования

    Если Успех Тогда
        Если пИмяАдминистратораКластера = "" Тогда
            Успех = Ложь;
        КонецЕсли;
        Если пПарольАдминистратораКластера = "" Тогда
            Успех = Ложь;
        КонецЕсли;
        Если пИмяАдминистратораИнформационнойБазы = "" Тогда
            Успех = Ложь;
        КонецЕсли;
        Если пПарольАдминистратораИнформационнойБазы = "" Тогда
            Успех = Ложь;
        КонецЕсли;
    КонецЕсли;    
    
    Если Успех Тогда
        СтрокаСоединенияИБ = СтрокаСоединенияИнформационнойБазы();//"File="/home/юзер/1cBases/Конфа";"  или "Srvr="1c.Сервак.ru";Ref="Конфа";"

        ЭтоСервернаяБаза = Истина;
        Если СтрНайти(СтрокаСоединенияИБ, "File=") > 0 Тогда
            ЭтоСервернаяБаза = Ложь;//ФайловаяБаза

        Иначе
            МассивПараметровСоединенияИБ = РазложитьСтрокуНаПодстроки(СтрокаСоединенияИБ, ";");
            //СерверИБ = 

            //пАдресСервераАдминистрирования = 

            Для Каждого СтрМассиваСоединенияИБ Из МассивПараметровСоединенияИБ Цикл
                Если СтрНайти(СтрМассиваСоединенияИБ, "Srvr=") > 0 Тогда
                    пАдресСервераАдминистрирования = СтрЗаменить(СтрМассиваСоединенияИБ, "Srvr=", "");
                    пАдресСервераАдминистрирования = СтрЗаменить(пАдресСервераАдминистрирования, """", "");
                ИначеЕсли СтрНайти(СтрМассиваСоединенияИБ, "Ref=") > 0 Тогда
                    пИмяИнформационнойБазыВКластере = СтрЗаменить(СтрМассиваСоединенияИБ, "Ref=", "");
                    пИмяИнформационнойБазыВКластере = СтрЗаменить(пИмяИнформационнойБазыВКластере, """", "");
                КонецЕсли;    
            КонецЦикла;    
        КонецЕсли;    

        Если ЭтоСервернаяБаза Тогда
            
            //массив запущенных клиентов по которым будем отключать

            КлиентскиеПриложения = Новый Массив;
            КлиентскиеПриложения.Добавить(ВРег("1CV8"));//толстый клиент 

            КлиентскиеПриложения.Добавить(ВРег("1CV8C"));//тонкий клиент

            КлиентскиеПриложения.Добавить(ВРег("WebClient"));//web-клиент

            КлиентскиеПриложения.Добавить(ВРег("COMConnection"));//внешнее соединение 1С:Предприятия через COM

            КлиентскиеПриложения.Добавить(ВРег("WSConnection"));//web-сервис

            //КлиентскиеПриложения.Добавить(ВРег("BackgroundJob")); //обработк заданий 

            //КлиентскиеПриложения.Добавить(ВРег("SrvrConsole")); //консоль кластера 

            //КлиентскиеПриложения.Добавить(ВРег("COMConsole")); //администрирование сессии внешнего соединения

            //КлиентскиеПриложения.Добавить(ВРег("JobScheduler")); //планировщик заданий 

            //КлиентскиеПриложения.Добавить(ВРег("Designer")); //конфигуратор / отладка

            
            СеансыИнформационнойБазы = ПолучитьСеансыИнформационнойБазы();
            НомераСеансов = Новый Массив;
            стСписокКРасстрелу = "";
            Для Каждого СеансИБ Из СеансыИнформационнойБазы Цикл
                Если КлиентскиеПриложения.Найти(ВРег(СеансИБ.ИмяПриложения)) <> Неопределено Тогда
                    Если СеансИБ.НачалоСеанса < ДатаУбийства Тогда
                        Если СеансИБ.Пользователь.Имя <> пИмяАдминистратораИнформационнойБазы Тогда
                            НомераСеансов.Добавить(СеансИБ.НомерСеанса);
                            стСписокКРасстрелу = стСписокКРасстрелу + Строка(СеансИБ.Пользователь.Имя) + " ";
                        КонецЕсли;    
                    КонецЕсли;    
                КонецЕсли;    
            КонецЦикла;    
            
            ОбщегоНазначенияКлиентСервер.СообщитьПользователю(стСписокКРасстрелу);//сообщение пользователю

            
            Если НомераСеансов.Количество() > 0 Тогда
                
                //Для COM

                //ПараметрыАдминистрирования = Новый Структура();

                //ПараметрыАдминистрирования.Вставить("ТипПодключения", "COM"); // "COM" или "RAS"

                //ПараметрыАдминистрирования.АдресАгентаСервера = "ххх.ххх.ххх.ххх";

                //ПараметрыАдминистрирования.ПортАгентаСервера = 1540; //по умолчанию в 1С используется 1540

                //ПараметрыАдминистрирования.ПортКластера = 1541; //по умолчанию в 1С используется 1541

                //Для RAS

                ПараметрыАдминистрирования = Новый Структура();
                ПараметрыАдминистрирования.Вставить("ТипПодключения", "RAS");// "COM" или "RAS"

                ПараметрыАдминистрирования.Вставить("АдресСервераАдминистрирования", пАдресСервераАдминистрирования);
                ПараметрыАдминистрирования.Вставить("ПортСервераАдминистрирования", Число(пПортСервераАдминистрирования));
                //общее

                ПараметрыАдминистрирования.Вставить("ПортКластера", Число(пПортКластера));//по умолчанию в 1С используется 1541

                ПараметрыАдминистрирования.Вставить("ИмяАдминистратораКластера", пИмяАдминистратораКластера);//Если нет в кластере "Администратора", то нужно создать

                ПараметрыАдминистрирования.Вставить("ПарольАдминистратораКластера", пПарольАдминистратораКластера);
                
                
                ПараметрыАдминистрированияИБ = АдминистрированиеКластераКлиентСервер.ПараметрыАдминистрированияИнформационнойБазыКластера();
                ПараметрыАдминистрированияИБ.ИмяВКластере = пИмяИнформационнойБазыВКластере;
                ПараметрыАдминистрированияИБ.ИмяАдминистратораИнформационнойБазы = пИмяАдминистратораИнформационнойБазы;
                ПараметрыАдминистрированияИБ.ПарольАдминистратораИнформационнойБазы = пПарольАдминистратораИнформационнойБазы;
                
                СтруктураСеанса = Новый Структура;
                СтруктураСеанса.Вставить("Свойство", "Номер");
                СтруктураСеанса.Вставить("ВидСравнения", ВидСравнения.ВСписке);
                СтруктураСеанса.Вставить("Значение", НомераСеансов);
                Фильтр = ОбщегоНазначенияКлиентСервер.ЗначениеВМассиве(СтруктураСеанса);
                
                АдминистрированиеКластераКлиентСервер.УдалитьСеансыИнформационнойБазы(ПараметрыАдминистрирования, ПараметрыАдминистрированияИБ, Фильтр);
                //АдминистрированиеКластераRASКлиентСервер.УдалитьСеансыИнформационнойБазы(ПараметрыАдминистрирования, ПараметрыАдминистрированияИБ, Фильтр); //для Linux

                
                ЗаписьЖурналаРегистрации("УдалениеПользователейВНочи", УровеньЖурналаРегистрации.Информация, , , "Список пользователей к отключению: " + стСписокКРасстрелу);
                
            КонецЕсли;    
        КонецЕсли;    
    КонецЕсли;    
    
КонецПроцедуры
   AlexYurg
 
10 - 02.11.18 - 16:40
(8) Насчет "интервала перезапуска" есть разные мнения. Это борьба с утечкой памяти.
 
 Рекламное место пустует
   AlexYurg
 
11 - 02.11.18 - 16:40
(9) Спасибо!
   Winnie Buh
 
12 - 02.11.18 - 17:23
(0) RDP нет?
   Вафель
 
13 - 02.11.18 - 17:30
(10) не рекомендуют, потому что не понятно в какое время будет этот перезапуск.
Если он придется на время работы юзеров, то никому не понравится
   AlexYurg
 
14 - 02.11.18 - 17:42
(12) Нет
(13) Согласен, но на обсуждаемую проблему это никак не влияет.

Список тем форума
Рекламное место пустует  Рекламное место пустует
ВНИМАНИЕ! Если вы потеряли окно ввода сообщения, нажмите Ctrl-F5 или Ctrl-R или кнопку "Обновить" в браузере.
Рекламное место пустует