Остановка и перезапуск сервера 1С:Предприятия 8.3 на Linux без потери данных
Содержание
Остановить службу 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 живёт дальше. Обычно это рабочий процесс, который ждёт ответа от СУБД или застрял на тяжёлой операции.
Действуйте по нарастающей.
Найдите оставшиеся процессы и их номера:
pgrep -u usr1cv8 -aПошлите вежливый сигнал завершения и подождите 15–30 секунд:
sudo kill -15 <PID>Если процесс не ушёл — завершите его жёстко:
sudo kill -9 <PID>Если хвостов много, снимите все процессы пользователя
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.
pgrep -u usr1cv8 -a, завершите оставшийся rphost через kill -15, затем kill -9.ss -tlnp и завершите. Иногда порт держит вторая версия платформы, запущенная своим юнитом.ss -tlnp | grep 1545, запустите юнит ras или ras cluster --daemon.rac session list по user-name и last-active-at, завершите через rac session terminate. Останавливать службу не нужно.rac process list.Скрипт для ночного обслуживания сервера 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С.
Запуск сервера 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С и убедитесь, что процессов
usr1cv8нет. - Скопируйте каталог
/home/usr1cv8/.1cv8/1C/1cv8/целиком в резервную копию. - В каталоге
reg_1541удалите подкаталоги, имя которых начинается сsnccntx. - Запустите службу.
Не удаляйте файл 1CV8Clst.lst и сам каталог reg_1541. В них список баз и настройки кластера. Без них придётся заново регистрировать все базы.
Права после ручных правок
Если что-то копировали или восстанавливали от root, верните владельца:
sudo chown -R usr1cv8:grp1cv8 /home/usr1cv8/.1cv8
Группа grp1cv8 создаётся установщиком. Если у вас её нет, посмотрите группу командой id usr1cv8.
Частые вопросы
Можно ли перезапустить только одну базу, не останавливая службу?
rac session terminate. Остальные базы продолжат работать.Что будет с файловыми базами при остановке службы?
Как остановить одну из двух установленных версий платформы?
srv1cv8-8.3.23.1865@default и srv1cv8-8.3.24.1342@default. Останавливайте нужную по полному имени. Работать одновременно на одних портах они не могут.Нужно ли останавливать службу 1С при обновлении конфигурации базы?
Сколько ждать перед kill -9?
kill -15. Если процесс в это время выполняет запрос в СУБД, ожидание дольше обычно ничего не меняет.