Как правильно перезапустить службу сервера 1С:Предприятие для очистки зависших лицензий и освобождения памяти?

Системный администратор 1С v8.3 (Управляемые формы) IT и автоматизация бизнеса
← На главную

В процессе эксплуатации сервера 1С:Предприятие 8.3 администраторы часто сталкиваются с ситуацией, когда стандартный перезапуск службы через оснастку "Службы" или простые команды net stop и net start не приносит желаемого результата. Основные проблемы заключаются в "зависших" сеансах, которые продолжают удерживать лицензии, и утечках памяти в рабочих процессах rphost. Рассмотрим детально, как реализовать "чистый" перезапуск сервера, гарантированно завершить все процессы и очистить временные данные.

Метод 1: Использование штатных настроек консоли кластера

Прежде чем переходить к радикальным мерам в виде скриптов, разберем возможности самой платформы. Начиная с версии 8.3.15, в 1С появились развитые механизмы управления рабочими процессами. Проанализируем настройки, которые помогут минимизировать необходимость ручного вмешательства.

Войдем в консоль администрирования кластеров и в свойствах рабочего сервера обратим внимание на следующие параметры:

  1. Перезапуск рабочих процессов: установим значение в секундах (например, 86400 для перезапуска раз в сутки). Это позволит системе плавно завершать старые процессы rphost и запускать новые, освобождая накопленную в памяти "грязь".
  2. Предел памяти (Memory Limit): вместо внешних скриптов мониторинга, настроим параметры "Безопасный расход памяти за один вызов" и "Максимальный объем памяти рабочих процессов". Если процесс превысит лимит, кластер сам создаст новый процесс, а старый будет помечен к завершению.
  3. Время засыпания пассивного сеанса: установим разумный предел (например, 1200 секунд), чтобы неактивные пользователи не занимали лицензии.

Метод 2: Создание скрипта для принудительной остановки и очистки кеша

Если штатные механизмы не справляются или произошел критический сбой, при котором процессы "повисли" в статусе Stopping, воспользуемся пакетным файлом. Разберем логику работы надежного скрипта перезапуска.

Основная проблема при перезапуске — это сохранение сеансовых данных. Если мы просто перезапустим службу, 1С попытается восстановить соединения из файлов snccntx. Чтобы этого избежать, нам нужно остановить службу и физически удалить эти файлы. Рассмотрим пример кода:


set LOG_FILE="C:\1C_scripts\logs\restart_log.txt"
set SERVICE_1C_NAME="1C:Enterprise 8.3 Server Agent (x86-64)"
set CNTX_PATH="C:\srvinfo\reg_1541"
set TEMP_PATH="C:\Windows\Temp"

echo --- Начало обслуживания %DATE% %TIME% --- >> %LOG_FILE%

rem Останавливаем службу
sc stop %SERVICE_1C_NAME%
timeout /t 10 /nobreak

rem Принудительно убиваем процессы, если они не закрылись
taskkill /f /im "rphost.exe"
taskkill /f /im "rmngr.exe"
taskkill /f /im "ragent.exe"

timeout /t 5 /nobreak

rem Очистка сеансовых данных (именно здесь хранятся "зависшие" лицензии)
echo Очистка snccntx... >> %LOG_FILE%
DEL /Q /F /S %CNTX_PATH%\snccntx*

rem Очистка временных файлов Windows
echo Очистка Temp... >> %LOG_FILE%
DEL /Q /F /S %TEMP_PATH%\*.*

rem Запуск службы
sc start %SERVICE_1C_NAME%
echo --- Завершено %DATE% %TIME% --- >> %LOG_FILE%

Важное замечание: путь C:\srvinfo\reg_1541 может отличаться в зависимости от ваших настроек (параметр -d в строке запуска службы). Обязательно проверьте его перед запуском скрипта. Удаление файлов snccntx* позволяет полностью сбросить состояния всех сеансов, что гарантирует освобождение всех программных лицензий. Для автоматизации этой процедуры можно использовать скрипт для очистки серверного кэша и сеансовых данных 1С.

Метод 3: Использование PowerShell для отказоустойчивого рестарта

Batch-файлы имеют ограничение: они не всегда корректно обрабатывают ошибки доступа к файлам. Разберем более современный подход с использованием PowerShell. Этот метод позволяет дождаться реального завершения процессов и применить "жесткое" удаление только в случае необходимости.

Выясним причину, по которой Stop-Service иногда зависает. Это происходит из-за того, что дочерние процессы (rphost) блокируют ресурсы. Посмотрим на алгоритм PowerShell-скрипта:


$ServiceName = "1C:Enterprise 8.3 Server Agent (x86-64)"
$ProcNames = @("rphost", "rmngr", "ragent")

Write-Host "Остановка службы $ServiceName..."
Stop-Service -Name $ServiceName -Force -ErrorAction SilentlyContinue

# Ждем 30 секунд и убиваем процессы, если остались
Start-Sleep -Seconds 30
foreach ($name in $ProcNames) {
    $procs = Get-Process -Name $name -ErrorAction SilentlyContinue
    if ($procs) {
        Write-Host "Принудительное завершение $name"
        Stop-Process -Name $name -Force
    }
}

# Очистка кеша (путь нужно адаптировать под свою систему)
$CachePath = "C:\ProgramData\1C\1cv8\srvinfo\reg_1541"
if (Test-Path $CachePath) {
    Get-ChildItem -Path $CachePath -Filter "snccntx*" -Recurse | Remove-Item -Force
}

Start-Service -Name $ServiceName
Write-Host "Служба успешно запущена"

Метод 4: Борьба с утечками памяти через мониторинг процессов

Иногда нам не нужно перезагружать весь сервер, а достаточно завершить только тот процесс rphost, который потребил слишком много оперативной памяти. Рассмотрим ситуацию: один из пользователей запустил тяжелый отчет, и процесс вырос до 10 Гб, замедляя работу остальных.

Проанализируем скрипт, который находит такие процессы и завершает их. Это заставит кластер 1С перераспределить сеансы на другие рабочие процессы.


@echo off
set /a LimitGB=8
set /a LimitBytes=%LimitGB% * 1024 * 1024 * 1024

for /f "usebackq tokens=2" %%a in (`tasklist /FO list /FI "IMAGENAME eq rphost.exe" ^| find /i "PID:"`) do (
    for /f "usebackq tokens=1" %%c in (`"wmic process where ProcessId=%%a get WorkingSetSize"`) do (
        set mem=%%c
        if defined mem (
            if %%c GTR %LimitBytes% (
                echo Killing process PID %%a with usage %%c bytes
                taskkill /F /PID %%a
            )
        )
    )
)

Рассмотрим подробнее: данный скрипт перебирает все запущенные rphost, запрашивает их текущий размер через wmic и сравнивает с установленным лимитом (в примере — 8 Гб). Это позволяет автоматизировать борьбу с утечками памяти без прерывания работы всего сервера. Для интерактивного мониторинга и сброса зависших процессов также подойдёт веб-приложение для управления сеансами и процессами rphost.

Метод 5: Проверка на стороне СУБД

Бывают случаи, когда даже после полной очистки кеша 1С сеансы "воскресают". Проанализируем причину: это может быть связано с тем, что на стороне SQL Server (MS SQL или PostgreSQL) остались открытые транзакции или зависшие соединения. Служба 1С при старте видит, что база данных занята, и это мешает корректной инициализации.

Выясним, как это решить. Перед запуском службы 1С рекомендуется программно разорвать все соединения с базой данных на уровне СУБД. В MS SQL Server для этого можно использовать команду:

ALTER DATABASE [Имя_Базы] SET SINGLE_USER WITH ROLLBACK IMMEDIATE;

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

ALTER DATABASE [Имя_Базы] SET MULTI_USER;

Итоги и рекомендации

Подведем итог нашему исследованию. Для стабильной работы сервера 1С:Предприятие 8.3 рекомендуется придерживаться следующей стратегии:

Соблюдение этих шагов позволит вам забыть о проблемах "зависших" лицензий и обеспечит высокую производительность системы в режиме 24/7.

← На главную