Простая проверка "целостности" и резервное копирование реестра кластера сервера 1С Предприятия на Linux-сервере
1C-admin
09.01.2019
Bash-скрипт для проверки контрольной суммы файла реестра кластера и создания резервной копии данного файла в случае, если изменение считается «корректным», при работе сервера 1С Предприятия на платформе GNU/Linux.
Полагаю, кому доводилось сталкиваться с ситуацией, что файл реестра кластера оказывался поврежденным или, возможно, с ним происходили еще какие-то казусы, сможет оценить сей "инструмент" по достоинству.
Скрипт просматривает рабочий каталог сервера и анализирует все имеющиеся на данном сервере кластеры
#!/bin/bash
#
# 1C Enterprise 8.3 Cluster Registry Check and Backup Script
#
# (c) 2025, Alexey Y. Fedotov
#
# Email: fedotov@kamin.kaluga.ru
#
INIT_SCRIPT=`ls /etc/init.d/srv1cv8*`
# Use system 1C Enterprise settings
. ${INIT_SCRIPT} > /dev/null
. /etc/sysconfig/${INIT_SCRIPT##*/}
# Get real cluster work directory
[[ ! ${SRV1CV8_DATA} ]] && SRV1CV8_DATA="/home/${SRV1CV8_USER}/.1cv8/1C/1cv8" && \r
[[ -f ${SRV1CV8_DATA}/location.cfg ]] && SRV1CV8_DATA=`cat ${SRV1CV8_DATA}/location.cfg | awk -F"=" '{print $2}'`
# Find all clusters in work directory
RMNGR_PORTS=`find ${SRV1CV8_DATA} -name reg_* -printf %f | sed -r 's/reg_/ /g'`
BACKUP_DIR="/home/backup" # Backup directory
CACHE_DIR="/var/tmp/1C" # Cache directory
REG_FILE="1CV8Clst.lst" # Cluster registry file name
MAX_CPS=30 # Maximum number of changes per second
# Check cache directory existance
[[ ! -d ${CACHE_DIR} ]] && mkdir ${CACHE_DIR}
for CURR_PORT in $RMNGR_PORTS
do
CURR_CHECKSUM=""
[[ -f ${SRV1CV8_DATA}/reg_${CURR_PORT}/${REG_FILE} ]] && \r
CURR_CHECKSUM=`md5sum ${SRV1CV8_DATA}/reg_${CURR_PORT}/${REG_FILE} | awk '{print $1}'` && \r
CURR_VERSION=`grep "}$" ${SRV1CV8_DATA}/reg_${CURR_PORT}/${REG_FILE} | sed -r 's/.*,([0-9]*)}$/1/'` || \r
echo "ERROR: Current cluster registy (port ${CURR_PORT}) not found!"
[[ ! ${CURR_CHECKSUM} ]] && continue
[[ -f ${SRV1CV8_DATA}/reg_${CURR_PORT}/1CV8Clsto.lst ]] && \r
OLD_CHECKSUM=`md5sum ${SRV1CV8_DATA}/reg_${CURR_PORT}/1CV8Clsto.lst | awk '{print $1}'` && \r
OLD_VERSION=`grep "}$" ${SRV1CV8_DATA}/reg_${CURR_PORT}/1CV8Clsto.lst | sed -r 's/.*,([0-9]*)}$/1/'`
[[ ! -f ${CACHE_DIR}/clstr_reg_${CURR_PORT}.hash ]] && echo ${CURR_VERSION}:${CURR_CHECKSUM} > ${CACHE_DIR}/clstr_reg_${CURR_PORT}.hash
CACHE_HASH=($(cat ${CACHE_DIR}/clstr_reg_${CURR_PORT}.hash | sed 's/:/ /'))
if ([ ${CACHE_HASH[1]} != ${CURR_CHECKSUM} ]); then
echo "INFO: Cluster registry (port ${CURR_PORT}) is changed!"
DIFF_VERSION=$((${CURR_VERSION}-${CACHE_HASH[0]}))
if ([ ${DIFF_VERSION} -gt 0 ] && [ ${DIFF_VERSION} -le ${MAX_CPS} ]); then
echo "${CURR_VERSION}:${CURR_CHECKSUM}" > ${CACHE_DIR}/clstr_reg_${CURR_PORT}.hash
[[ $((${CURR_VERSION}-1)) -eq ${OLD_VERSION} ]] && \r
zip ${BACKUP_DIR}/${REG_FILE%.*}.zip ${SRV1CV8_DATA}/reg_${CURR_PORT}/${REG_FILE} > /dev/null && \r
echo "INFO: Current cluster registry (port ${CURR_PORT}) is backuped succesful!" || \r
echo "WARNING: Something wrong, old and current cluster registry version (port ${CURR_PORT}) not synced!"
[[ ${DIFF_VERSION} -gt 1 ]] && echo "WARNING: Cluster registry (port ${CURR_PORT}) is changed more then one time (${DIFF_VERSION}) at period of control!"
else
echo "ERROR: Invalid version of current cluster registry (port ${CURR_PORT})!";
[[ ${CACHE_HASH[0]} -eq ${OLD_VERSION} && ${CACHE_HASH[1]} -eq ${OLD_CHECKSUM} ]] && echo "INFO: Version of old cluster registry (port ${CURR_PORT}) is valid!";
fi
fi
done
На что стоит обратить внимание:
1. Скрипт использует временный каталог /var/tmp/1C (можно изменить в соответсвующей переменной) для хранения файла(ов) содержащего(их) "номер версии" и значения контрольной суммы файла реестра кластера;
2. Переменная MAX_CPS содержит значение максимального количества изменений версий файла реестра за период контроля. Файл реестра может менять достаточно часто все зависит от конкретной системы.
3. Скрипт выводит какую-либо информацию только в случае если было зафиксировано изменение файла реестра, в противном случае его работа "молчалива".
Пример использования на сервере с CentOS
1. Размещаем файл скрипта на сервере, к примеру, в каталоге /usr/local/sbin
$ sudo cp clsrt_registry_check.sh /usr/local/sbin
2. Устанавливаем для данного скрипта права на исполнение
$ sudo chmod 755 /usr/local/sbin/clstr_registry_check.sh
3. С помощью любого удобного редактора добавляем задание в таблицу /etc/crontab, которое будет выполнятся каждую минуту
* * * * * root /usr/local/sbin/clstr_registry_check.sh
4. Перезапускаем сервис crond
$ sudo service crond restart
P.S. Обязательно настраивайте получение почты для пользователя root на свой почтовый ящик, тогда Вам будут приходить письма информирующие Вас о ходе выполнения заданий crond, и о результатах выполнения данного скрипта, в частности.
P.P.S. Любая критика, предложения, пожелания, замечания приветствуются!