Удаляем намертво зависшие фоновые задания без перезагрузки сервера 1С

Думаю, многим, имеющим дело с клиент-серверным 1С, хотя бы иногда приходилось сталкиваться с зависшими фоновыми заданиями, которые невозможно безболезненно, без перезапуска сервера 1С, прибить ни одним из штатных инструментов (консоль заданий, консоль администрирования серверов 1С и т.п.). В публикации описан один из возможных способов решения проблемы.

Проблема не новая и время от времени обсуждается на всевозможных 1С-ных форумах. Самое простое и популярное решение — это перезагрузка сервера 1С. К сожалению, этот вариант не всегда допустим или крайне нежелателен. На такой случай существуют более деликатные решения.

Вот один из таких способов в виде краткой пошаговой инструкции:

   1.   С помощью консоли администрирования серверов 1С ищем проблемное фоновое задание в списке соединений (например, по времени начала его работы, сравнив с временем начала работы регламентированного задания в консоли заданий). Определяем рабочий процесс, в котором находится зависшее соединение.  


   2.   Открываем свойства этого процесса и отмечаем его как неиспользуемый (если используется один единственный процесс, то предварительно необходимо создать новый рабочий процесс — для того, чтобы все активные соединения переподключились к нему). Запоминаем номер PID данного процесса.

 

 

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

   4.   На компьютере с сервером 1С с помощью диспетчера задач ищем соответствующий ему процесс rphost.exe по PID отключенного рабочего процесса и удаляем его.

 

   5.   На всякий случай можно удалить отключенный нами рабочий процесс 1С с пощью админ. консоли и, при необходимости, создать новый.

   6.   Готово. Можно войти в консоль заданий и проверить работоспособность регламентного задания.


Изменения:

23.04.2014 — внес корректировки согласно замечаниям в комментариям.

 

52 Comments

  1. 1cprogr_nsk

    Это всё применимо к 8.1 и 8.2, а как применить на 8.3? Как известно там нельзя создать процесс вручную (Создаются автоматически на основе настроек сервера в кластере) и если он один, то и отключить нельзя… И не у всех имеется доп. ключ защиты чтобы использовать уровень отказоустойчивости например 1, чтобы перекинуть соединения на другой кластер…

    Reply
  2. konstruktiv

    Здесь уже где-то есть такая статья, только зачем искать процесс по ip-порту, когда в свойствах указан pid, для идентификации по pid кастомные диспетчеры не нужны

    Reply
  3. quazar-ed

    Спасибо, интересно не знал )

    Reply
  4. KAPACEB.AA

    (1) dr.death,

    Спасибо за комментарий! Полезная информация — на 8.3 еще с подобным не сталкивался. Изменю в свойствах публикации, что относится только к 8.1 и 8.2.

    Reply
  5. KAPACEB.AA

    (2) konstruktiv,

    Спасибо за комментарий! Подобную статью искал — не нашел. Видимо, плохо искал.

    Что касается диспетчера задач — внесу корректировки в публикацию. По pid, конечно, удобнее и универсальнее получается.

    Reply
  6. aspirator23

    Если не ошибаюсь, просто так активные соединения на другой процесс сами не перейдут.

    Чтобы они подключились, их придется убить.

    Убивать можно, если они не ведут активную работу.

    Опять же если не ошибаюсь — проверить не на чем.

    Reply
  7. help1Ckr

    Спасибо за материал. Было бы интересно еще для 8.3

    Reply
  8. т1951

    Спасибо, интересно.

    Reply
  9. Puk2

    Как на практике мигрируют сеансы на новый рабочий процесс?

    Вроде где-то читал, что без прерывания работы перекидываются только пользователи с тонким клиентом, и то при условии что в данный момент нет операций с данными. Хотя возможно там речь была про миграцию сеансов на резервный кластер.

    В общем интересует, убиваются ли соединения пользователей с отключаемого рабочего процесса? Или же происходит миграция, незаметная для пользователя без перезапуска клиентской части?

    Reply
  10. KAPACEB.AA

    (9) Puk2,

    Хороший вопрос.

    Буквально сегодня выяснил из разговора со знакомым, что на 8.1 «мягкой» миграции из процесса в процесс не происходило — соединения были жестко привязаны к процессу. И действительно выход был только один — убивать процесс вместе со всеми его соединениями. Получается, что метод актуален в основном для 8.2. Хотя и в случае 8.1 (и 8.3?) позволит хотя бы минимизировать количество убитых соединений, если используется несколько рабочих процессов.

    Что касается видов приложений — только что проверил, как они мигрируют. Погонял активные соединения между двумя процессами — успешно перебрасываются основные виды приложений — тонкий, толстый, веб-расширение. Не уверен, но по-моему COM-соединения с фоновыми заданиями тоже корректно переподключились (хотя возможно, что это уже новые создались). Конфигуратор, похоже не может переподключаться автоматом. Также обратил внимание, что соединения, имеющие активное соединение с СУБД не переподключаются пока соединение не завершится, что, наверное, логично.

    Reply
  11. burlakov

    хорошая статья. метод реально работает на 8.2

    Reply
  12. LexSeIch

    Спасибо! Взял материал на заметку…

    Reply
  13. erp-consul

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

    Reply
  14. dka80

    на 8.3 работать не будет

    Reply
  15. 1С_Мастер

    А что мешает просто перезапустить службу? Вероятность того, что при этом отвалятся клиенты не сильно высока

    Reply
  16. KAPACEB.AA

    (15) q1q1q1,

    Возможно — не пробовал. А что произойдет с проблемными фоновыми заданиями в таком случае? Отвалятся?

    Reply
  17. 1С_Мастер

    (16)

    Да, отвалятся. Следующий старт заданий произойдет по расписанию

    Reply
  18. KAPACEB.AA

    (17) q1q1q1,

    Спасибо, надо попробовать.

    Reply
  19. shmax

    15. отваливаются и отваливается много, часто все.

    Reply
  20. Denis S

    Наконец-то найдено решение! Спасибо автору!

    Reply
  21. EmpireSer

    Странное решение…

    Я на 8.3 делаю всё проще (и на 8.2 тоже самое работает):

    1. Открываю «Администрирование серверов 1С Предприятия»

    2. Выделяю нужную базу и захожу в «Свойства»

    3. Запрещаю запуск регламентных заданий.

    4. Прибиваю соединение этого «зависшего» фонового задания

    5. … делаю что надо…

    6. Разрешаю запуск рег. заданий

    P.S. У нашего клиента есть такая «странная» конфа («1С:Подрядчик строительства 4.0. Управление финансами, редакция 3.0») у которой всегда есть одно «зависшее» фоновое задание.

    Вот описанным выше методом мы его убиваем.

    Reply
  22. KAPACEB.AA

    (21) EmpireSer,

    Проблема в том, что бывают соединения, которые не удается удалить через консоль администрирования.

    Reply
  23. EmpireSer

    (22)

    Если сеанса нет, а висят зависшие соединения — то твой способ то, что надо.

    Хотя это, описанное тобой решение, универсально.

    Если говорить не только про фоновые задания, то моя практика показала (хотя это только на 8.3 заметил), что на этом рабочем процессе (где нашлось «зависшее» соединение) все остальные соединения тоже «зависшие».

    В моём случаи кластер просто запустил новый рабочий процесс и сам перевёл активные соединения на новый. В итоге получилось, что «зависший» рабочий процесс позволял удались сеанс, но соединения не «отваливались».

    Вывод:

    Я бы рекомендовал дополнить твой способ предварительной блокировкой запуска регламентных заданий. Так надёжнее.

    Reply
  24. konstruktiv

    (6) aspirator23, как раз таки если они ведут активную работу, то тогда соединения и сами перейдут на другой процесс.

    Reply
  25. DjSpike

    А как это можно сделать на Linux? В нем нет «Консоли администрирования серверов 1с» .

    Reply
  26. AlexO

    (15) q1q1q1,

    А что мешает просто перезапустить службу? Вероятность того, что при этом отвалятся клиенты не сильно высока

    Конечно не высока. Где-то около 100% отвала всех подключений к серверу в течении пяти минут — пока сервер «сообразит», что ничего у него не работает.

    Reply
  27. AlexO

    (21) EmpireSer,

    3. Запрещаю запуск регламентных заданий.

    (13) erp-consul,

    Обычно убивал в консоли все процессы и соединения

    это не помогает зачастую, когда особенно запущенный случай. А все остальные и так прибиваются через консоль заданий.

    (22)

    Проблема в том, что бывают соединения, которые не удается удалить через консоль администрирования.

    если про сессии — как раз в консоли все удляется. Не удаляется процесс подключения к серверу. А не удаляется потому, что он активен и «висит» в ОС.

    (24) konstruktiv,

    как раз таки если они ведут активную работу

    речь именно про зависшие процессы, а не те, которые «ведут активную работу». Они и так удаляются, без плясок ))

    (25) DjSpike,

    А как это можно сделать на Linux?

    суть не в консоли. Ищите процесс, и удаляйте его из задач ОС. Правда, отключатся и все сессии 1С, которые в данный момент «идут» через него.

    Reply
  28. KAPACEB.AA

    (26) AlexO,


    если про сессии — как раз в консоли все удляется. Не удаляется процесс подключения к серверу. А не удаляется потому, что он активен и «висит» в ОС.

    К сожалению, не все удаляется. Об этом и речь. Сеанс/соединение в консоли удаляешь, из списка он исчезает, но после обновления списка снова отображается. При этом рабочий процесс «живой», с активными пользовательскими сеансами (хотя на живость, честно говоря, не проверял, пользователей не опрашивал).

    Reply
  29. AlexO

    (28)

    Сеанс/соединение в консоли удаляешь

    это разные вещи в 1С.

    Именно, что сеанс (сессия в терминологии 1С) удаляется из консоли, а соединение — нет.

    из списка он исчезает, но после обновления списка снова отображается.

    да никуда он не исчезает, это недоработка 1с — она никак не сигнализирует, что с соединением что-то не так, и сервер не может удалить данное соединение (а не может удалить — потому что ОС считает его «живым», ведь оно активно как никогда).

    И зависает именно на стороне 1С-сервера по различным причинам. И именно сервер же 1С не может его сбросить самостоятельно (исправить собственный «косяк»).

    с активными пользовательскими сеансами

    навряд ли все сессии будут живыми в подобном «зависшем» рабочем процессе — если сервер 1С не «понял» (и уже никак не «воспринимает») одно соединение из пула, то и остальные для него — скорей всего, не существуют уже.

    Я таких ситуаций стараюсь не допускать, но в тестовых весь пул сессий в таком соединении — «мертвый».

    Reply
  30. KAPACEB.AA

    (29) AlexO,

    это разные вещи в 1С. Именно, что сеанс (сессия в терминологии 1С) удаляется из консоли, а соединение — нет.

    Несомненно, вещи разные. И в подобных случаях я наверняка пытался удалять и то и другое — поведение, по-моему, было одинаковое как в случае сеанса так и в случае соединения. Хотя сейчас уже не могу уверенно утверждать — давно не сталкивался с проблемой. Если будет возможность, постараюсь более тщательно исследовать вопрос.

    в тестовых весь пул сессий в таком соединении — «мертвый».

    Хм, интересно… Приму к сведению, спасибо.

    Reply
  31. AlexO

    (30)

    Приму к сведению, спасибо.

    С вас-то какой спрос, лучше б 1С подходило к разработке более ответственно, раз уж взялась за гуж 🙁

    Reply
  32. Cartman

    На 8.3 такое не прокатывает. Жаль.

    Как удалить соединение пока не понятно.

    Reply
  33. djam_arttek

    Спасибо за мануал, однако это скорее костыль но не решение проблемы, которая судя по всему существует начиная с 8.3.4 и заканчивая 8.3.6

    Reply
  34. Гость

    Добрый день, подскажите, почему в пункте 2, выпадающее меню не активно, пробовал и доменным админом и локальным. (запускаю с сервера на котором установлен сервер 1с)

    Спасибо за заранее за ваши размыления на тему.

    Reply
  35. KAPACEB.AA

    (35) Alex,

    Добрый день!

    Может быть, процесс уже не активен/выключен?

    Простите, ничего толковее в голову не пришло 🙂

    Reply
  36. Гость

    (36)

    Да нет, все 5 процессов активны.

    И даже тот, на котором сейчас работаю все сеансы.

    Просто даже не понятно в какую сторону капать, обычно такое из за прав доступа, но куда уж больше чем локальный админ?

    Reply
  37. pagol

    Спасибо большущее!!!

    Помог!

    Reply
  38. Xershi

    Добавь в статью как добавлять рабочий процесс, без этой инфы результат не получить!

    Reply
  39. AlexeyK1

    у меня в консоли сервера не доступно изменять на неиспользуемое и создать новый рабочий процесс не дает

    Reply
  40. herfis

    (40) AlexeyK1, Статья старая. До 8.3 можно было вручную управлять рабочими процессами. Смотри в (34) фокус для 8.3 с интервалом перезапуска.

    По-идее, должно работать. Нормальные сеансы должны перенестись на новые рабочие процессы, а «мертвые» 1С убить не сможет, как и процессы их породившие. Останется убить их средствами ОС. Насколько я понимаю, свойство кластера «Принудительно завершать проблемные процессы» призвана автоматизировать это дело.

    Т.е. в идеале, если настроить интервал перезапуска и эту галку, то 1С будет автоматом убивать процессы с зависшими после переноса сеансами.

    Reply
  41. Xershi

    (40) AlexeyK1, да у нас тоже 8.3. В комментах вычитал про интервал. Тогда создается 2 рабочий процесс и он сам делает перевод активных сеансов. Единственное, когда убиваешь процесс, без перезагрузки их количество не уменьшается, хоть они и не активны.

    Reply
  42. KAPACEB.AA

    (42) Xershi, (41) herfis, (40) AlexeyK1,

    Статья актуальна только для 8.2 (см. Платформа в разделе Характеристики справа).

    Reply
  43. pavlo

    А программно можно получить по, скажем номеру сеанса у app-шника spid скуля?

    Кто нибудь решал такую задачу?

    Reply
  44. corn2010

    (34) единственный рабочий способ для 8.3 из предложенных

    Reply
  45. Xershi

    (43) сегодня нужно было убить фоновое задание обновления ПТИ. Убил но в соединениях осталось висеть. Второй процесс не создался, время не пришло. Опять наткнулся на вашу статью. Но минут через 15 фоновое задание либо само завершилось, либо 1С его убило. Платформа 8.3.13. В итоге рассосалось само собой. Так бы быстрее было бы агента рестартануть, но нужно было сделать для одной базы, а на сервере их две.

    Reply
  46. p.ugrumov

    Просто завершить службу зависшего RPHOST для зависшего задания. (найти по id) в рабочем процессе.

    Есть вероятность, что пользователи даже не вылетят, по крайней мере неработающие прямо сейчас.

    Reply
  47. Magellan32

    (46) В 8.3 можно настроить параметры рабочего сервера:

    Указать параметр Количество ИБ на процесс = 1

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

    Сеансы других баз при этом не пострадают.

    Reply
  48. kudim

    Спасибо за актуальный комментарий про 8.3

    Как раз на днях процесс намертво завис.

    Reply
  49. DiademGuards

    (47)Также была проблема с зависшим рабочим процессом. Удаление процесса rphost из Диспетчера задач по номеру PID не помогло, в Консоли кластера процесс так и остался. Перезагрузка службы сервера не помогла.

    Решение:

    — посмотреть порт зависшего процесса

    — в диспетчере задач если не включена колонка CommandLine

    — найти процесс rmngr с нужным портом и завершить дерево процессов

    После данных действий зависший рабочий процесс с консоли ушёл

    Reply
  50. armaros

    Есть еще более простой способ без завершения процессов и перезагрузки сервера. Действует и на 8.3.

    Нужно завершить все сеансы данной базы, удалить и заново добавить базу в список. И все!

    Reply
  51. Fox-trot

    (51) а журнал регистрации не отвалится?

    Reply
  52. frkbvfnjh

    (34) В какой книжке это написано? Что бы знать, а то по названию окошек, ничерта не понятно, какое на что реально влияет и как себя ведет

    Reply

Leave a Comment

Ваш адрес email не будет опубликован. Обязательные поля помечены *