Остановка кластера 1С:Предприятия под Linux без потери данных и зависших процессов
Содержание
Сервер 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-<версия>@default | systemctl stop srv1cv8-<версия>@default |
| до 8.3.21 | srv1cv83 | systemctl 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. Корректный порядок ручной остановки:
- Отправьте мягкий сигнал агенту:
sudo kill -TERM <pid ragent>. - Подождите 30–60 секунд и снова проверьте список процессов.
- Оставшимся
rphostиrmngrотправьтеkill -TERMпо одному. - Только если процесс не реагирует несколько минут —
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. Подготовку из первого раздела никто не отменял.
Кластер из двух и более рабочих серверов
Если в кластере несколько рабочих серверов, остановка службы на одном не гасит весь кластер. Его рабочие процессы перестанут обслуживать сеансы, а клиенты переподключатся к оставшимся серверам — при условии, что те назначены на нужные базы и у них хватает лицензий.
Порядок такой:
- Решите, какой сервер выводите из работы и кто примет нагрузку.
- Проверьте требования назначения функциональности в свойствах оставшихся рабочих серверов.
- Остановите службу на выводимом сервере.
- Убедитесь через
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 целиком.