rundeck通过WINRM执行powershell作业时终止任务未终止远程进程问题问询
Rundeck终止WINRM作业时远端Windows进程未同步终止的可行解决方案
问题根因
当前使用的2.11.11-1版本Rundeck的WINRM执行逻辑存在固有局限:作业在Rundeck侧触发终止操作时,仅会断开和远端Windows主机的WINRM TCP连接,不会通过WINRM协议向远端发送PowerShell进程的终止指令,也不会联动清理会话衍生的子进程,最终就会出现远端进程持续运行、不随作业终止退出的情况。
可落地的解决方法
- 自定义作业执行的全流程清理钩子
- 在所有WINRM类型作业的PowerShell脚本入口位置,加入进程自追踪代码:获取当前PowerShell进程的主PID,递归遍历所有衍生子进程的PID,写入到远端系统临时目录的专属文件中(文件路径关联对应的Rundeck作业ID,避免不同作业的进程清单混淆)
- 在Rundeck项目的作业流程配置中,为所有WINRM作业绑定「作业终止触发时的自动清理步骤」:终止动作触发后,自动通过WINRM执行清理命令,读取之前存储的PID清单,强制杀掉所有关联进程,再删除临时的PID文件。参考清理命令:
Get-Content $env:TEMP\rundeck_job_*.pid | ForEach-Object { Stop-Process -Id $_ -Force -ErrorAction SilentlyContinue }; Remove-Item $env:TEMP\rundeck_job_*.pid -Force
- 替换匹配版本的修复版WINRM插件
选择和2.11.11-1核心版本完全兼容的WINRM插件包,替换原有内置插件。修复后的插件逻辑会调整终止流程:当Rundeck侧收到作业终止信号时,不再仅断开连接,而是通过WINRM协议向远端发送明确的PowerShell会话终止请求,驱动远端WINRM服务主动结束会话关联的所有进程。插件替换完成后,需要打开插件配置中的cleanup_child_processes选项,否则终止逻辑仍会沿用默认的断开连接模式。 - 配置远端主机的兜底清理定时任务
在所有被Rundeck纳管的Windows主机上,配置每1分钟运行一次的PowerShell定时任务:扫描所有和Rundeck节点没有保持活跃TCP连接的WINRM会话,强制终止这些非活跃会话关联的所有PowerShell进程。该方案不依赖Rundeck侧的触发逻辑,哪怕出现连接异常中断、清理信号发送失败的情况,最多1分钟即可清理完所有残留进程,避免资源长期被占用。
注意:针对已经稳定运行2年的Rundeck环境,不建议为了解决单个问题直接跨大版本升级——2.11系列到后续版本的配置、插件、权限模型改动较大,迁移成本很高,优先选择上面提到的低侵入性调整方案即可。
内容的提问来源于stack exchange,提问作者Francis Dounga
相关产品推荐
相关产品推荐

