You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何在Rundeck Web UI终止作业时实现优雅停止与清理?

解决Rundeck手动终止作业时的优雅清理问题

我之前也碰到过一模一样的困扰——手动终止Rundeck作业时,脚本里的清理逻辑死活不跑,磁盘留一堆垃圾文件。核心原因确实如你所说:Rundeck默认用Thread#interrupt中断执行线程,这个操作不会触发bash的EXIT陷阱(它不属于系统信号范畴)。下面几个亲测有效的解决方案,你可以根据场景选:

方案1:让Rundeck发送可捕获的系统信号

Rundeck支持配置终止作业时发送的信号类型,我们可以改成bash能捕获的SIGTERM或SIGINT,这样陷阱就能正常触发了。

全局配置(所有节点生效)

修改Rundeck服务器的rundeck-config.properties文件,添加/更新以下配置:

# 设置终止时发送SIGTERM信号,bash可捕获
rundeck.execution.interrupt.mode=sigterm

重启Rundeck服务后,所有作业终止时都会给目标进程发SIGTERM。

单个节点配置(仅特定节点生效)

如果不想全局修改,也可以在节点定义里单独设置:

nodes:
  - name: your-target-node
    hostname: node.example.com
    interruptMode: kill  # kill模式会先发送SIGTERM,超时后再发SIGKILL
    # 其他节点属性...

之后更新你的脚本,确保陷阱覆盖常见终止信号:

#!/bin/bash -ex
finish() {
    echo "Removing directory $OUTPUT..."
    rm -Rf "$OUTPUT"
}
# 捕获EXIT、SIGINT、SIGTERM、SIGHUP等信号
trap finish EXIT INT TERM HUP
# 脚本其余业务逻辑...

方案2:用Rundeck原生的Finally工作流步骤

这是最稳妥的Rundeck原生方案,不需要改脚本或服务器配置。Rundeck的工作流支持Finally步骤——不管作业是成功完成、失败还是被手动终止,这个步骤都会强制执行。

操作步骤:

  1. 打开作业编辑页面,找到工作流区域
  2. 点击「Add Step」旁的下拉菜单,选择「Add Finally Step」
  3. 在Finally步骤里添加清理逻辑:可以直接执行rm -Rf /path/to/your/output-dir,或者调用你的清理脚本
  4. 保存作业即可

这个方案完全由Rundeck工作流管控,不需要依赖脚本的信号捕获,可靠性拉满,就算脚本本身挂了也能保证清理。

方案3:针对远程节点的SSH连接处理

如果你的作业在远程节点执行,Rundeck终止时会直接关闭SSH连接,此时bash进程会收到SIGHUP信号。你可以在脚本里显式捕获这个信号:

#!/bin/bash -ex
finish() {
    echo "Removing directory $OUTPUT..."
    rm -Rf "$OUTPUT"
}
# 重点捕获HUP信号(SSH连接断开时触发)
trap finish HUP EXIT INT TERM
# 脚本其余业务逻辑...

这个方案适合没有Rundeck服务器管理员权限的场景,只需要修改脚本就能生效。


内容的提问来源于stack exchange,提问作者bfontaine

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.28 06:27:32