Останавливается служба 1С, порт уже используется
Добрый день! Уважаемые читатели и гости одного из крупнейших блогов по системному администрированию 🍀Pyatilistnik.org. В прошлый раз мы с вами устранили ошибку, когда запуск программы невозможен так как на компьютере отсутствует vcruntime140.dll. Сегодня у меня не менее интересная тема, в данной публикации вы узнаете по какой причине у вас останавливается служба 1С после 5 минут работы, обожаю я просто эту компанию.
Описание ситуации
Есть виртуальный сервер на гипервизоре Vmware ESXI 6.5 с установленной операционной системой Windows Server 2016. На нем развернут сервер 1С предприятия 8.3. По регламенты организации сервер был отправлен на обслуживание, всякие там обновляшки и все такое. После его перезагрузки ко мне обратился разработчик и сообщил, что у него не работает служба 1С. Я зашел по RDP на сервер и обнаружил, что в оснастке службы, сервисы 1С в состоянии оставлены:
- 1C Remote Administration Service (RAS)
- 1C Enterprise 8.3 Server Agent
Хочу отметить, что 1С, это просто пример, в такой ситуации может оказать любая служба, например SQL Server, и такие примеры так же я встречал.
Восстановление работы службы 1С
Первое, что я полез делать, это в оснастке "Службы" проверил нет ли зависимостей которые могли не работать, для этого открываете свойства 1C Enterprise 8.3 Server Agent или 1C Remote Administration Service (RAS), переходите на вкладку зависимости (Dependencies), но я там ничего не обнаружил. Так же я удостоверился, что у меня тип запуска службы выставлено автоматически. Попробовав запустить сервис 1С я получил, что через 5 минут он опять остановился.
Первым делом я как и любой системный администратор полез в логи Windows через просмотр событий, хотя можно использовать и Windows Admin Center. Изучал их, изучал, да так ничего и не нашел связанного с 1С, я вот всегда удивлялся почему они не сделают свой отдельный журнал.
Следующим шагом я решил посмотреть какие порты на текущий момент слушает служба 1С.
Для решения нашей задачи вы можете воспользоваться любым из представленных средств:
- Утилита NetStat
- Утилита TCPView
- PowerShell
О каждой из них я подробно уже рассказывал, советую почитать. Мне по душе TCPView. Открыв ее выждите секунд 30, чтобы утилита просканировала все процессы и определила что за что отвечает. После чего нажмите пробел, чтобы включить паузу. В системах, где 1С работает корректно, порты TCP 1541-1562 должны слушаться процессом rphost.exe и rmngr.exe, в моем случае он ссылается на C:\Program Files\1cv8\8.3.15.1656\bin\rphost.exe и C:\Program Files\1cv8\8.3.15.1656\bin\rmngr.exe.
Вот еще пример кода PowerShell, который позволит вам узнать ID процесса, который занял ваш порт, а по ID уже вычислить сам процесс все в том же диспетчере задач, данный метод подойдет если у вас нет под рукой TCPView.
$tcpPort = "1541"
$tcpConn = Get-NetTCPConnection | Where-Object {$_.LocalPort -eq $tcpPort -or $_.RemotePort -eq $tcpPort}
$tcpConn
$process = $tcpConn | Select-Object OwningProcess -Unique
if ($process -ne $null)
{
Get-Process | Where-Object {$_.id -eq $process.OwningProcess} | Select-Object Id, ProcessName
}
else
{
write-output "No services found using that port"
}
Но в моем случае служба печати Spooler просто заняла эти порты. Самый простой вариант, это останавливаем службу, которая заняла нужный порт, и запускаем нужный сервис, который должен подхватить нужный порт, после этого пробуем запустить ранее остановленную службу. В большинстве случае, это помогает, если нет делаем дальше по инструкции.
Могу вам точно сказать из своей практики, что это специфическая работа операционной системы Windows. Немного освежу вашу память, в Windows есть такая вещь, как динамические порты, система их берет рандомно и назначает процессам. Каждый сеанс TCP требует двух конечных точек - конечной точки клиента и конечной точки сервера. Каждая конечная точка представляет собой комбинацию IP-адрес/порт, также известную как сокет TCP.
Обычно клиент запрашивает у ОС указание порта из ряда динамических портов. Сокет сервера - это порт IP/TCP службы, к которой подключается клиент (например, SQL Server или тот же 1С). Вот Windows и решила, что замечательно будет выделить порты из диапазона 1540-1562 для службы печати, пусть люди печатают же, Microsoft и не должна знать, что их кто-то использует, порты то динамические. Чтобы понять, какие порты у вас в системе обозначены как динамические вы можете выполнить команду. Открываем cmd от имени администратора и пишем:
В моем примере, диапазон портов был от 1025 до 65534. Как видно порты 1541 до 1560 находится в этом диапазоне, так что, если вам случится иметь клиента (например, системные службы ОС Windows), который запускается ДО того, как 1С сделает это, то у вас два варианта:
- Сделать так, чтобы ваша службы запускалась на другом порту
- Исключить нужные порты из диапазона динамических портов.
Как запускать 1С на другом порту
Вот пример скрипта меняющего, это
Подробнее посмотрите вот тут https://techlab.rarus.ru/news/articles/kak-pravilno-obnov-i-t-platformu-1s-i-zapustit-neskolko-sluzhb-1s-na-odnom-servere-/
Как сделать исключение портов из динамической группы
Лично мне данный метод нравится куда больше, что делаем. В командной строке от имени администратора введите команду. чтобы посмотреть текущие исключения:
Вот вам пример с моего компьютера с Windows 10. Как видно, тут есть порт 5985, 47001 это WinRM.
Теперь добавим новое исключение:
После выполнения этой команды вы увидите следующие исключенные порты
В некоторых ситуациях потребуется перезагрузить сервер. Надеюсь, что данная статья поможет вам завести вашу службу 1С.
Еще есть ветка реестра, где можно так же производить управление вашими службами:
Подробнее на https://docs.microsoft.com/en-us/windows/win32/services/automatically-starting-services
На этом у меня все. С вами был Иван Семин, автор и создатель IT портала 🍀Pyatilistnik.org.
спасибо, очень помогла статья
Добрый день! Рад, что смог быть полезен.