В процессе эксплуатации сервера 1С:Предприятие 8.3 администраторы часто сталкиваются с ситуацией, когда стандартный перезапуск службы через оснастку "Службы" или простые команды net stop и net start не приносит желаемого результата. Основные проблемы заключаются в "зависших" сеансах, которые продолжают удерживать лицензии, и утечках памяти в рабочих процессах rphost. Рассмотрим детально, как реализовать "чистый" перезапуск сервера, гарантированно завершить все процессы и очистить временные данные.
Прежде чем переходить к радикальным мерам в виде скриптов, разберем возможности самой платформы. Начиная с версии 8.3.15, в 1С появились развитые механизмы управления рабочими процессами. Проанализируем настройки, которые помогут минимизировать необходимость ручного вмешательства.
Войдем в консоль администрирования кластеров и в свойствах рабочего сервера обратим внимание на следующие параметры:
86400 для перезапуска раз в сутки). Это позволит системе плавно завершать старые процессы rphost и запускать новые, освобождая накопленную в памяти "грязь".Если штатные механизмы не справляются или произошел критический сбой, при котором процессы "повисли" в статусе 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С.
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 "Служба успешно запущена"
Иногда нам не нужно перезагружать весь сервер, а достаточно завершить только тот процесс 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.
Бывают случаи, когда даже после полной очистки кеша 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 рекомендуется придерживаться следующей стратегии:
snccntx* и временных файлов в папке Temp профиля пользователя, под которым работает служба.wmic для контроля размера rphost.sc stop/start обязательно делайте паузы (timeout) не менее 10-20 секунд, так как службам 1С требуется время для корректной выгрузки данных на диск.Соблюдение этих шагов позволит вам забыть о проблемах "зависших" лицензий и обеспечит высокую производительность системы в режиме 24/7.