Внезапный сбой в работе сервера приложений 1С:Предприятие на операционной системе Linux — ситуация критическая для любого бизнеса. При этом стандартная попытка запустить службу с помощью команды service srv1cv83 start часто возвращает лаконичное и малоинформативное сообщение: Starting 1C:Enterprise 8.3 server: Error: service failed to start! FAILED. При этом в системном логе /var/log/messages может не быть абсолютно никаких записей от процессов 1С.
В этой статье мы подробно разберем, как локализовать эту неисправность, заставить систему записывать подробные логи, выяснить физическую суть ошибки и восстановить работоспособность сервера приложений 1С несколькими способами — от радикального пересоздания кластера до точечного хирургического исправления конфигурационных файлов без потери настроек информационных баз.
Когда стандартный скрипт инициализации службы завершается ошибкой, первым делом необходимо исключить влияние самой оболочки демона и запустить исполняемые файлы сервера напрямую от имени системного пользователя 1С. По умолчанию в CentOS служба работает под пользователем usr1cv8.
Давайте авторизуемся под этим пользователем и выполним запуск агента сервера напрямую через консоль. Для этого выполним последовательно следующие команды:
su - usr1cv8
/opt/1C/v8.3/x86_64/ragent
Проанализируем поведение системы в консоли. Если сервер падает сразу или через короткий промежуток времени, мы увидим циклическую перезагрузку менеджера кластера. Вывод команды в консоли будет выглядеть следующим образом:
1C:Enterprise 8.3 (x86-64) (8.3.13.1865) Server Agent started. Ctrl+C to exit.
1C:Enterprise 8.3 (x86-64) (8.3.13.1865) Cluster Manager started. Ctrl+C to exit.
1C:Enterprise 8.3 (x86-64) (8.3.13.1865) Cluster Manager finished.
1C:Enterprise 8.3 (x86-64) (8.3.13.1865) Cluster Manager started. Ctrl+C to exit.
1C:Enterprise 8.3 (x86-64) (8.3.13.1865) Cluster Manager finished.
1C:Enterprise 8.3 (x86-64) (8.3.13.1865) Server Agent finished.
Этот лог наглядно показывает, что сам агент сервера ragent стартует успешно, но менеджер кластера rmngr мгновенно завершает свою работу (Cluster Manager finished). После нескольких неудачных попыток перезапустить менеджер, агент сервера также останавливается. Это сужает круг поиска: проблема кроется в настройках или целостности файлов самого кластера.
Чтобы понять, почему именно падает менеджер кластера, нам жизненно необходимы логи. Настроим технологический журнал 1С. Для этого создадим файл конфигурации logcfg.xml.
Обратите внимание на важный нюанс: на серверах Linux директория для записи логов должна быть доступна пользователю usr1cv8 на запись. Если указать стандартный путь /var/log/1c, запись может не пойти из-за ограничений прав доступа (SELinux или прав на саму папку). Надежнее всего настроить логирование во внутреннюю домашнюю директорию пользователя 1С, например в /home/usr1cv8/log.
Создадим файл конфигурации по пути /home/usr1cv8/.1cv8/1C/1cv8/conf/logcfg.xml со следующим содержимым:
<?xml version="1.0" encoding="UTF-8"?>
<config xmlns="http://v8.1c.ru/v8/tech-log">
<log location="/home/usr1cv8/log" history="168">
<event>
<eq property="Name" value="PROC"/>
</event>
<event>
<eq property="Name" value="CONN"/>
</event>
<event>
<eq property="Name" value="EXCP"/>
</event>
<property name="all">
</property>
</log>
</config>
Убедимся, что целевой каталог для логов существует и права на него выданы корректно:
mkdir -p /home/usr1cv8/log
chown -R usr1cv8:grp1cv8 /home/usr1cv8/log
chmod -R 775 /home/usr1cv8/log
После повторного запуска команды /opt/1C/v8.3/x86_64/ragent в каталоге логов появятся файлы технологического журнала. Проанализируем полученные данные.
В логах процесса rmngr мы обнаружим критическое исключение (EXCP), из-за которого менеджер кластера прекращает свою работу:
17:07.908000-0,EXCP,1,process=rmngr,OSThread=28397,Exception=acea3e6e-3687-4792-8319-09c009274c9a,Descr='./src/RHostImpl.cpp(2611):
acea3e6e-3687-4792-8319-09c009274c9a: Unknown registryID, expecting 35977c5c-91d7-11ea-1d93-00e04c360255. Check the cluster registry dir.'
Физическая суть проблемы: произошла рассинхронизация уникальных идентификаторов (UUID) кластера в его конфигурационных файлах. Менеджер кластера при старте обращается к глобальному файлу настроек сервера 1С, считывает ожидаемый UUID кластера, но в локальных файлах реестра самого кластера прописан совершенно другой идентификатор. Менеджер считает структуру данных поврежденной и аварийно останавливается во избежание порчи баз данных.
Давайте сопоставим содержимое файлов реестра, чтобы увидеть эту разницу:
/home/usr1cv8/.1cv8/1C/1cv8/1cv8wsrv.lst зарегистрирован кластер с UUID 35977c5c-91d7-11ea-1d93-00e04c360255:
{1,
{35977c5c-91d7-11ea-1d93-00e04c360255,"Local cluster",1541,"1cserver",0,0,0,0,0,0,0...
/home/usr1cv8/.1cv8/1C/1cv8/reg_1541/1CV8Clst.lst прописан абсолютно другой UUID — 3dcaa392-ab07-11ea-198f-00e04c360255:
{0,
{3dcaa392-ab07-11ea-198f-00e04c360255,"Local cluster",1541,"1cserver",0,0,0,0,0,0,0...
Эта рассинхронизация обычно происходит по нескольким причинам:
kill -9 во время выполнения операций обновления или изменения состава кластера.Если у вас добавлено множество информационных баз с настроенными правами, пользователями и журналами регистрации, их полная очистка и повторная регистрация займут много времени. Мы можем просто синхронизировать идентификаторы вручную, так как конфигурационные файлы 1С являются обычными текстовыми файлами со специфической сериализацией.
Выполним процедуру ручного исправления по шагам:
service srv1cv83 stop
rphost, rmngr или ragent, которые могут перезаписать файлы при выходе:
ps -fU usr1cv8
# Если процессы найдены, принудительно завершим их:
killall -9 rphost rmngr ragent
/home/usr1cv8/.1cv8/1C/1cv8/reg_1541/1CV8Clst.lst любым текстовым редактором (например, nano или vi).3dcaa392-ab07-11ea-198f-00e04c360255 и заменим его во всех вхождениях в этом файле на правильный (ожидаемый сервером) UUID из файла 1cv8wsrv.lst, то есть на 35977c5c-91d7-11ea-1d93-00e04c360255.reg_1541 присутствует резервный файл 1CV8Clsto.lst, проведем аналогичную замену UUID и в нем.
service srv1cv83 start
После выполнения этих действий сервер успешно стартует, все информационные базы, их настройки и журналы регистрации будут сохранены и доступны для пользователей.
Если файлов конфигурации немного или они повреждены настолько серьезно, что ручная правка не помогает, наиболее надежным способом будет полное удаление служебного каталога и создание чистой структуры данных кластера «с нуля».
Рассмотрим этот процесс по шагам:
service srv1cv83 stop
tar -czvf /home/usr1cv8/backup_1c_registry.tar.gz /home/usr1cv8/.1cv8/1C/1cv8/
rm -rf /home/usr1cv8/.1cv8/1C/1cv8/*
Примечание: Если вы настраивали технологический журнал, сохраните предварительно конфигурационный файл conf/logcfg.xml, чтобы не прописывать его заново.
service srv1cv83 start
service srv1cv83 status
Существует промежуточный вариант, когда нет необходимости удалять весь рабочий каталог (в котором могут лежать гигабайты кэша, сессий и журналов регистрации), но ручная правка UUID кажется слишком сложной. Мы можем удалить только сами конфигурационные файлы, отвечающие за перечень кластеров.
Для этого при остановленной службе сервера 1С удалим следующие файлы из папки /home/usr1cv8/.1cv8/1C/1cv8/:
1cv8wsrv.lst (файл описания списка кластеров сервера)reg_1541/1CV8Clst.lst (файл структуры конкретного кластера)reg_1541/1CV8Clsto.lst (резервный файл структуры, если есть)После этого запустим службу 1С. Сервер создаст новые чистые конфигурационные файлы с новыми согласованными UUID. Нам останется только заново прописать информационные базы в консоли администрирования.
Чтобы избежать повторения рассинхронизации идентификаторов кластера и повысить отказоустойчивость сервера 1С на Linux, рекомендуем придерживаться следующих правил:
/etc/hosts присутствует корректная запись для сопоставления IP-адреса и сетевого имени вашего сервера. Например:
127.0.0.1 localhost localhost.localdomain
192.168.1.50 1cserver 1cserver.local
service srv1cv83 stop. Это гарантирует, что менеджер кластера корректно завершит транзакции записи в файлы реестра и сбросит дисковые кэши.cron, который будет раз в сутки архивировать конфигурационный каталог /home/usr1cv8/.1cv8/1C/1cv8/. В случае повторного сбоя вы сможете восстановить работоспособность сервера за пару минут, просто распаковав резервную копию файлов реестра кластера.