PSSession 清理与断链
WinRM 远程会话会在远端占用资源:已经断开但未删除的会话依然计入每个用户的并发上限(默认 30 个)。会话积累到一定程度后,新建连接就会报「远端 shell 已占用」或配额已达上限。因此日常要养成查看、断开、清理的习惯,把失效会话及时回收,保证远程通道随时可用。
基本信息
| 适用平台 | Windows PowerShell 远程(WinRM) |
|---|---|
| 查看会话 | Get-PSSession |
| 断开与重连 | Disconnect-PSSession / Connect-PSSession |
| 清理 | Remove-PSSession |
| 配额项 | MaxShellsPerUser,默认 30 |
典型使用场景
- 网络抖动产生大量 Broken 会话后批量清理
- 计划维护时先断开会话,维护完成后再重连复用
- 排查「远端 shell 配额已满」的报错来源
- 长任务执行期间保持会话可恢复,而不是从头重跑
- 定期巡检运维机上残留的会话,避免配额被无声占满
- 自动化脚本执行完显式回收会话,防止长期运行累积泄漏
- 多人在同一台运维机上共用账号时,先看清会话归属再清理
常用示例
常用示例
Get-PSSession | Format-Table Id, ComputerName, State, Availability, IdleTimeout
# 清理失联的断开会话:
Get-PSSession | Where-Object State -eq 'Broken' | Remove-PSSession
# 计划维护:先断开,回来再连
$s = Get-PSSession -ComputerName web01
Disconnect-PSSession -Session $s
Connect-PSSession -Session $s
# 一次性清理本机全部会话(先确认没有进行中的任务):
Get-PSSession | Remove-PSSession
# 按目标主机过滤,只清理指定机器的会话:
Get-PSSession -ComputerName web01 | Remove-PSSession会话状态处理
| 状态 | 含义 | 处理建议 |
|---|---|---|
| Opened | 正常可用 | 保持或按需复用 |
| Disconnected | 断开但仍占用远端配额 | 按需重连复用或直接清理 |
| Broken | 链路中断的失联会话 | 删除后重建 |
| Closed | 已关闭 | 无需处理 |
Disconnected 状态的会话仍然占用远端并发配额,长期挂着也会被服务端按超时清理,所以要么及时重连复用,要么主动删除,不要放任积累。把配额与超时取值写进运维手册,交接时不容易踩坑。
删除会话会终止其中正在运行的任务,批量清理前先确认没有正在执行的作业,避免把同事的长任务一并中断。脚本里最好在 finally 块中清理会话,网络异常时也能释放资源。