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

· 10 мин

Содержание

Остановить службу 1С в Linux можно одной командой sudo systemctl stop <имя_службы>. Для платформ 8.3.21 и новее имя выглядит как srv1cv8-8.3.24.1342@default, для старых установок через init-скрипт — srv1cv83. Перед остановкой завершите сеансы пользователей: служба гасит агент, менеджер кластера и все рабочие процессы, и каждый, кто сейчас проводит документы, получит обрыв соединения.

Типичная ситуация: ночью нужно обновить платформу или снять копию базы на уровне PostgreSQL, а утром выясняется, что служба «остановилась», но rphost висит в памяти и держит порт. Порядок действий одинаков для обоих случаев: закрыть вход, остановить службу, проверить хвосты. Всё относится к платформе 8.3 на Ubuntu, Debian, Astra Linux, RED OS и других дистрибутивах с systemd.

Из каких процессов состоит сервер 1С на Linux

Служба сервера 1С — это не один процесс, а дерево. Понимать его нужно, чтобы видеть, что именно осталось висеть после остановки.

ПроцессЧто делаетПорт по умолчанию
ragentАгент сервера. Главный процесс службы, к нему подключаются клиенты и консоль1540
rmngrМенеджер кластера. Хранит реестр кластера, распределяет соединения1541
rphostРабочий процесс. В нём выполняется код конфигурации и живут сеансыиз диапазона, обычно 1560–1591
rasСервер администрирования для утилиты rac. Запускается отдельно1545

Все процессы работают от системного пользователя usr1cv8, его создаёт установщик. Родитель — ragent. Если убить только его, дочерние rmngr и rphost чаще всего завершатся следом. Но при зависании рабочего процесса так бывает не всегда, и он остаётся сиротой.

Посмотреть всё дерево разом:

ps -o pid,ppid,user,etime,rss,cmd -u usr1cv8

Колонка rss покажет память каждого процесса в килобайтах, etime — сколько он живёт. Рабочий процесс, который съел 10–20 ГБ и живёт неделю, — первый кандидат на перезапуск.

Данные кластера хранятся в каталоге пользователя usr1cv8, обычно это /home/usr1cv8/.1cv8/1C/1cv8/. Там лежит файл 1CV8Clst.lst (реестр кластера: базы, рабочие серверы, администраторы) и каталог reg_1541 с данными менеджера кластера. Сами базы лежат в СУБД, а не здесь.

Как узнать точное имя службы 1С

Имя службы зависит от того, как ставили платформу. Это главная причина, почему команда из чужой инструкции не срабатывает.

Платформа 8.3.21 и новее (единый дистрибутив). Файлы ставятся в /opt/1cv8/x86_64/<версия>/, а служба создаётся как шаблонный юнит systemd с номером версии в имени. Экземпляр по умолчанию называется default:

systemctl list-units --all 'srv1cv8*'

В выводе будет строка вида srv1cv8-8.3.24.1342@default.service. Если её нет, юнит не подключён — его подключают из каталога платформы командой systemctl link, указывая полный путь к файлу srv1cv8-<версия>@.service.

Старые установки из пакетов deb/rpm. Служба называется srv1cv83, управляется init-скриптом /etc/init.d/srv1cv83, systemd оборачивает его автоматически:

systemctl status srv1cv83

Сервер администрирования ras. В новых версиях для него тоже есть отдельный юнит ras-<версия>.service. В старых его часто запускают вручную командой ras cluster --daemon или своим юнитом, который написал администратор.

Быстрый способ найти всё, что связано с 1С, если имя забыли:

systemctl list-unit-files | grep -Ei '1cv8|srv1c|ras'

Остановка службы 1С через systemctl

Порядок, который не оставляет висящих процессов и не рвёт работу людей внезапно.

1. Предупредите пользователей и закройте вход

Отключите людей заранее, а не в момент остановки. Сначала запретите новые соединения и регламентные задания для базы, потом завершите оставшиеся сеансы. Как сделать это через rac, показано в разделе про сеансы ниже. Для одной базы то же самое делается в консоли кластера на Windows-машине: свойства информационной базы, флажки блокировки начала сеансов и регламентных заданий.

Остановка службы обрывает сеансы всех пользователей всех баз этого кластера. Несохранённые документы пропадут. Делайте это вне рабочего времени или после согласования с пользователями.

2. Остановите службу

# новые версии платформы
sudo systemctl stop srv1cv8-8.3.24.1342@default

# старые установки
sudo systemctl stop srv1cv83

Команда возвращает управление, когда systemd дождался завершения процессов или вышел тайм-аут. На загруженном сервере с десятком рабочих процессов это может занять до минуты.

3. Проверьте, что всё действительно остановилось

systemctl status srv1cv8-8.3.24.1342@default
pgrep -u usr1cv8 -a
ss -tlnp | grep -E ':15(40|41|45|[6-9][0-9])'

Статус должен быть inactive (dead), pgrep ничего не выводит, порты свободны. Если хоть один rphost остался — переходите к следующему разделу.

4. Если службу нужно выключить надолго

stop не отменяет автозапуск: после перезагрузки сервера служба поднимется снова. На время переноса или длительного обслуживания отключите автозапуск:

sudo systemctl disable srv1cv8-8.3.24.1342@default

Вернуть — командой enable.

КомандаЧто делаетКогда нужна
systemctl stopОстанавливает сейчас, автозапуск остаётсяОбновление, копирование, ночное обслуживание
systemctl restartОстанавливает и сразу запускаетСервер тормозит, процессы раздулись по памяти
systemctl disableУбирает из автозапуска, не останавливаетПеренос на другой сервер, вывод из работы
systemctl maskЗапрещает запуск совсем, даже вручнуюДве версии платформы, старую нельзя случайно поднять

Принудительное завершение процессов 1С из консоли

Бывает, что systemctl stop висит минутами или служба числится остановленной, а rphost живёт дальше. Обычно это рабочий процесс, который ждёт ответа от СУБД или застрял на тяжёлой операции.

Действуйте по нарастающей.

  1. Найдите оставшиеся процессы и их номера:

    pgrep -u usr1cv8 -a
    
  2. Пошлите вежливый сигнал завершения и подождите 15–30 секунд:

    sudo kill -15 <PID>
    
  3. Если процесс не ушёл — завершите его жёстко:

    sudo kill -9 <PID>
    
  4. Если хвостов много, снимите все процессы пользователя usr1cv8 разом:

    sudo pkill -15 -u usr1cv8
    sleep 20
    sudo pkill -9 -u usr1cv8
    

kill -9 обрывает транзакции в рабочем процессе без отката на стороне 1С. Откат сделает СУБД, данные в PostgreSQL не испортятся, но незавершённое проведение пользователю придётся повторить. Не применяйте -9 к процессам СУБД — только к процессам 1С.

pkill -u usr1cv8 снимет и ras, если он запущен от того же пользователя. После перезапуска основной службы не забудьте поднять и его, иначе rac перестанет отвечать.

Зависшие сеансы и рабочие процессы: диагностика через rac

Часто останавливать всю службу не нужно. Достаточно найти один сеанс, который держит блокировку, или один раздувшийся рабочий процесс. Для этого есть консольная утилита rac, она лежит в каталоге платформы рядом с ragent и работает через ras на порту 1545.

Убедитесь, что ras запущен, затем получите идентификатор кластера:

cd /opt/1cv8/x86_64/8.3.24.1342
./rac cluster list

Скопируйте значение поля cluster — это UUID. Дальше он нужен в каждой команде.

Список сеансов:

./rac session list --cluster=<uuid_кластера>

В выводе смотрите поля user-name, app-id (тип клиента: тонкий клиент, конфигуратор, фоновое задание), started-at и last-active-at. Сеанс, неактивный несколько часов, но с открытой транзакцией, — типичный виновник блокировок.

Завершить конкретный сеанс:

./rac session terminate --cluster=<uuid_кластера> --session=<uuid_сеанса>

Рабочие процессы и их память:

./rac process list --cluster=<uuid_кластера>

Если в кластере задан администратор, к каждой команде добавьте --cluster-user и --cluster-pwd. Полный набор параметров для вашей версии покажет ./rac help session и ./rac help process.

Прежде чем убивать рабочий процесс, перенесите с него нагрузку штатно. В свойствах рабочего сервера задаётся допустимый объём памяти процессов. При его превышении кластер сам перезапускает процесс, перенося сеансы. Это мягче, чем kill.

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

Скрипт для ночного обслуживания сервера 1С

Ручная остановка по ночам быстро надоедает. Её заменяет скрипт: закрывает вход в базы, завершает сеансы, перезапускает службу и пишет лог. Пример ниже рассчитан на один кластер и запускается от root.

#!/bin/bash
# /usr/local/sbin/1c-restart.sh — ночной перезапуск сервера 1С
set -u
VER="8.3.24.1342"
RAC="/opt/1cv8/x86_64/$VER/rac"
SVC="srv1cv8-$VER@default"
LOG="/var/log/1c-restart.log"

echo "$(date '+%F %T') старт обслуживания" >> "$LOG"

CLUSTER=$("$RAC" cluster list | awk '/^cluster /{print $3; exit}')

# завершаем все сеансы кластера
for S in $("$RAC" session list --cluster="$CLUSTER" | awk '/^session /{print $3}'); do
    "$RAC" session terminate --cluster="$CLUSTER" --session="$S" >> "$LOG" 2>&1
done

systemctl stop "$SVC"
sleep 10

# добиваем хвосты, если остались
if pgrep -u usr1cv8 -x rphost >/dev/null; then
    echo "$(date '+%F %T') остались rphost, kill -15" >> "$LOG"
    pkill -15 -u usr1cv8 -x rphost
    sleep 20
    pkill -9 -u usr1cv8 -x rphost
fi

systemctl start "$SVC"
echo "$(date '+%F %T') служба запущена: $(systemctl is-active "$SVC")" >> "$LOG"

Скрипт добивает только rphost, а не все процессы usr1cv8, чтобы не задеть ras, от которого зависит rac. Если ras запущен своим юнитом, это безопасно.

Сделайте файл исполняемым и поставьте в cron на 03:00:

sudo chmod +x /usr/local/sbin/1c-restart.sh
echo '0 3 * * * root /usr/local/sbin/1c-restart.sh' | sudo tee /etc/cron.d/1c-restart

Проверьте, что в это время не идут регламентные задания и резервное копирование базы. Перезапуск посреди выгрузки в СУБД оборвёт её. Удобная схема: 02:00 — дамп PostgreSQL, 03:00 — перезапуск 1С.

Перед тем как поставить скрипт в cron
Выполнено: 0 / 6

Запуск сервера 1С после аварийной остановки

После отключения питания, OOM killer или жёсткого kill -9 служба иногда не поднимается сама или поднимается, но клиенты получают ошибки. Порядок восстановления такой.

Сначала СУБД, потом 1С

Сервер 1С при старте подключается к базам. Если PostgreSQL ещё не поднялся или проверяет журналы после сбоя, рабочие процессы будут падать с ошибками соединения.

systemctl status postgresql

Дождитесь статуса active, потом запускайте 1С.

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

journalctl -u srv1cv8-8.3.24.1342@default -n 100 --no-pager

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

sudo systemctl reset-failed srv1cv8-8.3.24.1342@default
sudo systemctl start srv1cv8-8.3.24.1342@default

Проверьте процесс-убийцу

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

journalctl -k | grep -i -E 'out of memory|killed process'

Строка с rphost означает, что памяти не хватило и ядро убило рабочий процесс. Лечится ограничением памяти рабочих процессов в настройках рабочего сервера, добавлением памяти или подкачки.

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

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

  1. Остановите службу 1С и убедитесь, что процессов usr1cv8 нет.
  2. Скопируйте каталог /home/usr1cv8/.1cv8/1C/1cv8/ целиком в резервную копию.
  3. В каталоге reg_1541 удалите подкаталоги, имя которых начинается с snccntx.
  4. Запустите службу.

Не удаляйте файл 1CV8Clst.lst и сам каталог reg_1541. В них список баз и настройки кластера. Без них придётся заново регистрировать все базы.

Права после ручных правок

Если что-то копировали или восстанавливали от root, верните владельца:

sudo chown -R usr1cv8:grp1cv8 /home/usr1cv8/.1cv8

Группа grp1cv8 создаётся установщиком. Если у вас её нет, посмотрите группу командой id usr1cv8.

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

Можно ли перезапустить только одну базу, не останавливая службу?
Нет, служба общая для кластера. Но можно заблокировать вход в одну базу и завершить только её сеансы через rac session terminate. Остальные базы продолжат работать.
Что будет с файловыми базами при остановке службы?
Ничего. Файловые базы не работают через сервер 1С, их открывают клиенты напрямую. Служба нужна только клиент-серверным базам.
Как остановить одну из двух установленных версий платформы?
У каждой версии свой юнит с номером в имени, например srv1cv8-8.3.23.1865@default и srv1cv8-8.3.24.1342@default. Останавливайте нужную по полному имени. Работать одновременно на одних портах они не могут.
Нужно ли останавливать службу 1С при обновлении конфигурации базы?
Нет. Для обновления конфигурации нужен монопольный доступ к базе: завершите сеансы этой базы и запретите вход. Служба при этом работает. Останавливать её нужно при обновлении самой платформы.
Сколько ждать перед kill -9?
Ориентир — 20–30 секунд после kill -15. Если процесс в это время выполняет запрос в СУБД, ожидание дольше обычно ничего не меняет.