Остановка кластера 1С:Предприятия под Linux без потери данных и зависших процессов

· 9 мин

Содержание

Сервер 1С на Linux останавливают через службу: на платформе 8.3.21 и новее это sudo systemctl stop srv1cv8-<версия>@default, на более ранних — sudo systemctl stop srv1cv83 или sudo /etc/init.d/srv1cv83 stop. Служба гасит агент ragent, а вместе с ним менеджер кластера rmngr и рабочие процессы rphost.

Перед командой выгоните пользователей и запретите новые сеансы, иначе у людей оборвётся работа посреди проведения документов. Если после остановки в системе остались процессы rphost, их добивают через kill. Ниже порядок действий для обоих типов установки, готовый скрипт и разбор случаев, когда сервер «не хочет» останавливаться.

Подготовка: что сделать до остановки сервера 1С

Остановка службы рвёт все соединения кластера разом. Пользователи увидят ошибку соединения с сервером, незаписанные документы пропадут, фоновое задание может прерваться на середине обмена.

Поэтому сначала решите три вопроса:

  • 🕐 Время. Ночь, обед или согласованное окно. Предупредите людей минут за 15–30.
  • 🔒 Запрет новых сеансов. Чтобы никто не зашёл, пока вы выгоняете остальных.
  • ⏸️ Регламентные задания. Обмены, загрузка выписок, отправка в ЭДО. Их лучше заблокировать, чтобы они не стартовали в момент остановки.

Запрет входа удобнее всего ставить через rac — консольную утилиту администрирования. Она работает через сервер администрирования ras, который должен быть запущен (по умолчанию слушает порт 1545):

# запустить сервер администрирования, если он не работает как служба
/opt/1cv8/x86_64/8.3.24.1691/ras cluster --daemon

# узнать идентификатор кластера
/opt/1cv8/x86_64/8.3.24.1691/rac cluster list

Здесь и дальше 8.3.24.1691 — пример. Подставьте свою версию: её видно по имени каталога в /opt/1cv8/x86_64/.

Дальше смотрите список баз и ставите блокировку:

CL=<uuid кластера>
rac infobase summary list --cluster=$CL

rac infobase update --cluster=$CL --infobase=<uuid базы> \
  --infobase-user="Администратор" --infobase-pwd="пароль" \
  --sessions-deny=on --scheduled-jobs-deny=on \
  --denied-message="Плановые работы на сервере" \
  --permission-code="0405"

Код разрешения позволит администратору зайти в заблокированную базу, если потребуется. Если на кластере задан администратор, к каждой команде rac добавьте --cluster-user и --cluster-pwd.

Если баз несколько, блокируйте каждую. Сеансы конфигуратора и фоновые задания от этого не исчезнут сами, их нужно завершить отдельно.

Штатные средства платформы: rac и консоль кластера

Когда вход запрещён, остаётся завершить текущие сеансы. Посмотреть их:

rac session list --cluster=$CL

В выводе у каждого сеанса есть session, user-name, app-id (1CV8C — тонкий клиент, Designer — конфигуратор, BackgroundJob — фоновое задание). Завершить один сеанс:

rac session terminate --cluster=$CL --session=<uuid сеанса>

Если удобнее графика, то же самое делается из консоли администрирования серверов 1С на Windows-машине. Её подключают к агенту на Linux-сервере по имени хоста и порту 1540. В дереве: кластер → «Информационные базы» → нужная база → «Сеансы». Выделяете сеансы и удаляете их из контекстного меню.

Чем rac лучше простой остановки службы

  • ✅ Пользователь получает понятное сообщение из --denied-message, а не обрыв связи.
  • ✅ Вы видите, кто ещё сидит в базе, и можете позвонить, прежде чем выгнать.
  • ✅ Блокировка остаётся в свойствах базы и после перезапуска сервера: никто не зайдёт, пока вы её не снимете.

Последний пункт — частая ловушка. После работ снимите блокировку той же командой с --sessions-deny=off --scheduled-jobs-deny=off, иначе утром бухгалтерия не попадёт в базу.

Остановка службы через systemd и init.d

Как называется служба, зависит от версии платформы и способа установки. Сначала найдите её:

systemctl list-units --all 'srv1cv8*'
ls /etc/init.d/ | grep srv1cv8

Платформа 8.3.21 и новее (systemd)

Начиная с 8.3.21 дистрибутив сервера содержит юнит-файл systemd в каталоге версии, например /opt/1cv8/x86_64/8.3.24.1691/srv1cv8-8.3.24.1691@.service. Его подключают командой systemctl link, а служба получает имя с суффиксом @default.

sudo systemctl stop srv1cv8-8.3.24.1691@default
sudo systemctl status srv1cv8-8.3.24.1691@default

В статусе должно быть inactive (dead). Если сервер администрирования оформлен отдельной службой (ras-8.3.24.1691.service или подобной), остановите её тоже, когда rac больше не нужен.

Чтобы служба не стартовала после перезагрузки, например на время переноса баз:

sudo systemctl disable srv1cv8-8.3.24.1691@default

Платформа до 8.3.21 (init.d)

Старые версии ставили скрипт /etc/init.d/srv1cv83. На современных дистрибутивах systemd оборачивает его автоматически, поэтому работают оба варианта:

sudo systemctl stop srv1cv83
# или
sudo /etc/init.d/srv1cv83 stop
sudo /etc/init.d/srv1cv83 status

Параметры этого скрипта (каталог кластера, порты, режим отладки) лежат в /etc/sysconfig/srv1cv83 на RHEL-подобных системах или в /etc/default/srv1cv83 на Debian и Ubuntu.

ПлатформаИмя службыКоманда остановки
8.3.21 и новееsrv1cv8-<версия>@defaultsystemctl stop srv1cv8-<версия>@default
до 8.3.21srv1cv83systemctl stop srv1cv83 или /etc/init.d/srv1cv83 stop

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

Ручное завершение процессов ragent, rmngr и rphost

Иногда служба остановилась, а процессы висят. Или служба вообще не зарегистрирована: сервер запускали руками через ragent -daemon. Тогда работаем с процессами напрямую.

Посмотреть, что живо:

ps -u usr1cv8 -o pid,ppid,etime,cmd | grep -E 'ragent|rmngr|rphost|ras'

usr1cv8 — пользователь, от имени которого сервер работает по умолчанию. Если вы меняли его при установке, подставьте своего.

Иерархия простая: ragent — родитель, он запускает rmngr и rphost. Корректный порядок ручной остановки:

  1. Отправьте мягкий сигнал агенту: sudo kill -TERM <pid ragent>.
  2. Подождите 30–60 секунд и снова проверьте список процессов.
  3. Оставшимся rphost и rmngr отправьте kill -TERM по одному.
  4. Только если процесс не реагирует несколько минут — sudo kill -9 <pid>.

Быстрый вариант для всех процессов пользователя сразу:

sudo pkill -TERM -u usr1cv8 -f 'rphost|rmngr|ragent'
sleep 30
sudo pkill -KILL -u usr1cv8 -f 'rphost|rmngr|ragent'

kill -9 не даёт процессу дописать данные. Для файловой базы это риск повреждения, для клиент-серверной — риск незавершённых транзакций, которые СУБД откатит. Сам кластер при этом может оставить неконсистентные файлы реестра. Используйте только как крайнюю меру.

Скрипт остановки для бэкапа и обслуживания

Типичная задача — ночью остановить 1С, сделать дамп PostgreSQL или копию каталога кластера и поднять сервер обратно. Ниже скрипт для платформы с systemd. Он ждёт штатной остановки и добивает зависшие процессы только по таймауту.

#!/bin/bash
# /usr/local/bin/stop-1c.sh
set -u
VER="8.3.24.1691"
UNIT="srv1cv8-${VER}@default"
USER1C="usr1cv8"
LOG="/var/log/stop-1c.log"

echo "$(date '+%F %T') остановка $UNIT" >> "$LOG"
systemctl stop "$UNIT"

for i in $(seq 1 12); do
  if ! pgrep -u "$USER1C" -f 'rphost|rmngr|ragent' > /dev/null; then
    echo "$(date '+%F %T') процессы завершены" >> "$LOG"
    exit 0
  fi
  sleep 5
done

echo "$(date '+%F %T') таймаут, принудительное завершение" >> "$LOG"
pkill -KILL -u "$USER1C" -f 'rphost|rmngr|ragent'
exit 1

Код возврата 1 подскажет вызывающему скрипту бэкапа, что остановка прошла не чисто. Запуск парой строк в crontab -e от root:

50 1 * * * /usr/local/bin/stop-1c.sh && /usr/local/bin/backup-1c.sh; systemctl start srv1cv8-8.3.24.1691@default

Здесь backup-1c.sh — ваш собственный скрипт копирования. Запуск службы стоит после ;, чтобы сервер поднялся даже при ошибке бэкапа.

Увеличить время на штатную остановку

Если rphost часто не успевает завершиться, дайте службе больше времени, не трогая юнит дистрибутива:

sudo systemctl edit srv1cv8-8.3.24.1691@default

В открывшемся редакторе:

[Service]
TimeoutStopSec=180

После сохранения выполните sudo systemctl daemon-reload. Когда время истечёт, systemd сам отправит процессам SIGKILL.

Перезапуск и остановка в нескольких особых случаях

Чаще нужна не остановка, а перезапуск: после смены лицензии, правки параметров кластера или утечки памяти в rphost. Для него есть одна команда:

sudo systemctl restart srv1cv8-8.3.24.1691@default

Сеансы оборвутся так же, как при stop. Подготовку из первого раздела никто не отменял.

Кластер из двух и более рабочих серверов

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

Порядок такой:

  1. Решите, какой сервер выводите из работы и кто примет нагрузку.
  2. Проверьте требования назначения функциональности в свойствах оставшихся рабочих серверов.
  3. Остановите службу на выводимом сервере.
  4. Убедитесь через rac session list, что пользователи работают на других серверах.

Центральный сервер с главным менеджером кластера останавливают последним. Без него кластер недоступен, даже если остальные серверы запущены.

Сервер в контейнере Docker

В контейнере служба systemd обычно не используется: ragent работает как основной процесс. Останавливайте контейнер командой docker stop -t 120 <имя>. Параметр -t даёт процессам 120 секунд на штатное завершение, по умолчанию их всего 10.

Диагностика: сервер не останавливается или не поднимается после остановки

Сначала смотрите журнал службы:

journalctl -u srv1cv8-8.3.24.1691@default --since "30 min ago"

Затем проверьте, кто держит порты кластера:

sudo ss -tlnp | grep -E ':(1540|1541|1545|15[6-9][0-9])'

1540 — агент, 1541 — менеджер кластера, 1545 — ras. Диапазон рабочих процессов по умолчанию 1560–1591, он задаётся в свойствах рабочего сервера.

Диагностика: выберите симптом

Очистка сеансового кэша

Если после аварийной остановки клиенты получают странные ошибки при входе, помогает очистка сеансовых данных сервера. При остановленной службе удаляют файлы snccntx* в подкаталоге reg_1541 каталога кластера. Файл 1CV8Clst.lst (реестр кластера со списком баз) не трогайте. Перед любыми удалениями скопируйте каталог srvinfo целиком.

Частые вопросы

Нужно ли останавливать PostgreSQL вместе с сервером 1С?
Нет. Для дампа через pg_dump СУБД должна работать. Останавливать PostgreSQL нужно только для копирования файлов кластера СУБД или обновления самой СУБД.
Можно ли перезапустить только рабочие процессы, не останавливая сервер?
Да. В консоли кластера можно выключить рабочий процесс в его свойствах, кластер поднимет новый. Пользователи этого процесса при этом потеряют соединение.
Как остановить сервер 1С без sudo?
Под обычным пользователем — никак: служба и процессы принадлежат usr1cv8 и root. Выдайте нужному пользователю право на конкретную команду systemctl через sudoers, а не полный доступ.
Остановка службы снимает блокировку входа в базы?
Нет. Запрет сеансов хранится в параметрах информационной базы в реестре кластера и после старта службы действует дальше. Снимайте его явно через rac или консоль.
Почему после обновления платформы старая служба продолжает работать?
Юнит привязан к номеру версии. Новая платформа — новая служба. Остановите и отключите старую, затем подключите и запустите новую, иначе они будут конкурировать за порт 1540.