Kestra 2.0.6 Ubuntu 22.04 安装指南

在 Ubuntu 22.04 上从零安装 Kestra 2.0.6:JDK 25 安装、官方二进制包下载校验、首次启动、systemd 托管、认证配置与卸载全流程实测记录。

KestraKestraUbuntuUbuntu 22.04LinuxsystemdJava2026/10/17

Kestra 2.0.6 Ubuntu 22.04 安装指南

目标:在 Ubuntu 22.04 上从零完成 Kestra 2.0.6 的下载校验、systemd 托管与认证配置。已在 Ubuntu 22.04 实测通过。

本文档所有命令与回显均来自 Ubuntu 22.04 实机安装实测(Kestra 2.0.6,2026-10-17),可逐条复现。

一、环境信息

  • 操作系统:Ubuntu 22.04.5 LTS
  • 架构:x86_64(12 vCPU / 31 GiB 内存,根分区可用约 152G)
  • Kestra 版本:2.0.6(revision b59444f,构建日期 2026-10-13)
  • Java 版本:OpenJDK 25.0.4.1(openjdk-25-jdk-headless)
  • 端口:8080(Web/API)
  • 数据目录:/opt/kestra(含 confs 配置、data 数据、plugins 插件、flows Flow 文件)
  • 配置路径:/opt/kestra/confs/application.yaml
  • 部署形态:单二进制 jar + systemd 托管(内嵌 H2)

二、Kestra 简介

2.1 Kestra 是什么

Kestra 是一个基于 Java 的事件驱动工作流编排平台(GitHub 约 29k star),采用 YAML 声明式定义工作流(Flow),内置 Web 编排控制台、调度器、队列与存储抽象,可用于数据管道、CI/CD 编排与自动化任务调度。发布件是一个自执行的 jar 文件(以 shell 脚本前缀包装,双态文件),下载后赋予执行权限即可启动,无需传统意义上的"安装包解压"。

2.2 实测环境

项目实测值
操作系统Ubuntu 22.04.5 LTS
架构x86_64
CPU12 vCPU
内存31 GiB
数据盘根分区 786G,可用约 152G
JavaOpenJDK 25.0.4.1(apt 仓库版本 25.0.4.1+1-1~22.04.4)
Kestra2.0.6
安装目录/opt/kestra
服务端口8080

💡 技术拓展:Kestra 官方支持 Ubuntu、Debian、RHEL 系列与多种运行方式(单二进制 jar、Docker、Docker Compose、Helm)。本篇走最通用的"单二进制 jar + systemd 托管"路线,不依赖任何专用包仓库;Docker Compose 部署见《Kestra 2.0.6 Docker Compose 部署指南》。

2.3 版本与发布件说明

Kestra 官方发布件托管在 GitHub Releases,每个版本提供同名二进制文件与 checksums_sha256.txt 校验文件,例如 2.0.6:

2.0.6 二进制文件实测大小为 130861812 字节(约 125 MB),SHA-256 校验值 c3c46e70ecda67cb8671dfbdcb848710c40a02666a56e794ef27d01da83d7922(后文校验步骤输出)。

💡 技术拓展:Kestra 各版本的发行说明与变更日志可在 https://github.com/kestra-io/kestra/releases 查看。从 2.0.5 升级到 2.0.6 的实测过程(含数据迁移验证)见《Kestra 2.0.6 进阶实战与运维》。

三、安装 JDK

3.1 为什么需要 JDK 25

Kestra 2.0.x 官方要求 Java 21 及以上版本。Ubuntu 22.04 的 jammy-updates 官方源已收录 openjdk-25-jdk-headless,可直接 apt 安装,无需添加第三方仓库。

3.2 更新软件源

apt-get update

回显:

Get:4 https://security.ubuntu.com/ubuntu jammy-updates/universe amd64 Packages [1257 kB]
Get:5 https://security.ubuntu.com/ubuntu jammy-updates/multiverse amd64 Packages [68.4 kB]
Get:6 https://security.ubuntu.com/ubuntu jammy-updates/restricted amd64 Packages [4962 kB]
Fetched 6769 kB in 6s (1132 kB/s)
Reading package lists... Done

3.3 安装 OpenJDK 25

apt-get install -y openjdk-25-jdk-headless

回显(安装输出末尾节选):

Setting up ca-certificates-java (20190909ubuntu1.3) ...
Processing triggers for libc-bin (2.35-0ubuntu3.15) ...
Processing triggers for ca-certificates (20260601~22.04.1) ...
Updating certificates in /etc/ssl/certs...
0 added, 0 removed; done.
Running hooks in /etc/ca-certificates/update.d...

done.
done.

3.4 验证 Java

java -version
which java

回显:

openjdk version "25.0.4.1" 2026-08-18
OpenJDK Runtime Environment (build 25.0.4.1+1-1-22.04.4-Ubuntu)
OpenJDK 64-Bit Server VM (build 25.0.4.1+1-1-22.04.4-Ubuntu, mixed mode, sharing)
/usr/bin/java

⚠️ 排障实录:如果系统同时存在多个 JDK,/usr/bin/java 可能指向旧版本。可用 update-alternatives --config java 交互选择默认 Java。实测 OpenJDK 25.0.4.1 运行 Kestra 2.0.6 启动、编排、升级链路全部正常(官方要求 Java 21 及以上)。

💡 技术拓展:Ubuntu 22.04 源中同时提供 openjdk-21-jre-headless(候选版本 21.0.12.1+1-1~22.04.4)。若只运行 Kestra,装 openjdk-25-jre-headless(无编译器的纯运行时)就够;本文装 jdk-headless 是为了同时获得 jps 等诊断工具,便于后续验证 JVM 参数。

四、下载与校验 Kestra

4.1 创建目录并下载

mkdir -p /opt/kestra && cd /opt/kestra
wget -q https://github.com/kestra-io/kestra/releases/download/v2.0.6/kestra-2.0.6
ls -la

回显(ls -la 输出,只列出文件行):

-rw-r--r-- 1 root root 130861812 Oct 17 00:21 kestra-2.0.6

⚠️ 排障实录:若服务器到 GitHub 直连不稳定,可在 wget 命令中显式指定代理(如 -e use_proxy=yes -e https_proxy=http://<代理地址>:<端口>),或改用 wget -c 断点续传重新执行同一命令。实测单次完整下载约 12~30 秒(视网络带宽,130 MB 文件实测峰值 18.8 MB/s)。

4.2 下载官方校验文件并校验

curl -sL https://github.com/kestra-io/kestra/releases/download/v2.0.6/checksums_sha256.txt | tee checksums_sha256.txt
sha256sum -c checksums_sha256.txt

回显:

kestra-2.0.6: c3c46e70ecda67cb8671dfbdcb848710c40a02666a56e794ef27d01da83d7922
kestra-2.0.6: OK

4.3 赋予执行权限并确认版本

chmod +x kestra-2.0.6
./kestra-2.0.6 --version

回显(第一行 WARN 为版本查询时的固定日志,随版本号一并输出):

01:10:12.295 WARN  main         i.m.p.PrometheusMeterRegistry The meter (MeterId{name='netty.alloc.arena.allocation.count', tags=[tag(arena.number=0),tag(memory=direct),tag(size=small)]}) registration has failed: Prometheus requires that all meters with the same name have the same set of tag keys. There is already an existing meter named 'netty_alloc_arena_allocation_count' containing tag keys [arena_number, memory]. The meter you are attempting to register has keys [arena_number, memory, size]. Note that subsequent logs will be logged at debug level.
2.0.6

⚠️ 排障实录:首次执行 ./kestra-2.0.6 --version 时会先输出一行 WARN 日志(Prometheus meter 注册相关),随后在下一行打印版本号 2.0.6,该 WARN 为正常现象可忽略。若提示 -bash: ./kestra-2.0.6: Permission denied,说明漏了 chmod +x。

💡 技术拓展:这个文件是"双态文件"——本质是一个带 shell 脚本前缀的自解压 jar,既可以直接执行(./kestra-2.0.6 server local),也可以用 java -jar kestra-2.0.6 server local 显式运行。前者会自动寻找 java 并传递 JAVA_OPTS 环境变量给 JVM,本篇全部采用直接执行方式。

4.4 认识命令行入口

./kestra-2.0.6 --help

回显(Commands 节选):

Commands:
  server           Start a kestra server
  flow             Manage flows
  namespace        Manage namespaces
  plugins          Manage plugins
  templates        Manage templates
  task             Execute tasks
  execution        Manage executions
  execution-history  Manage executions data
  trigger          Manage triggers
  sys              Perform system operations
  templates-validate  Validate templates
  media            Manage media

最常用的入口是 server local(单机全功能模式,一键启动 WebServer、Executor、Scheduler、Indexer 等全部服务,内嵌 H2 数据库)与 server standalone(按角色拆分的多进程模式,用于集群部署)。--help 之外的验证方式:启动后用 ./kestra-2.0.6 server --help 可查看全部服务角色列表。

五、首次启动

5.1 前台启动测试

先以前台方式启动一次,观察初始化日志,确认可以正常运行后按 Ctrl+C 停止,再转入正式的托管方式:

./kestra-2.0.6 server local

启动日志回显(节选,约 30~50 秒完成初始化):

01:10:31.026 INFO  main         i.k.c.c.s.AbstractServerCommand Machine information: 12 available cpu(s), 16032MB max memory, Java version 25.0.4.1+1-1-22.04.4-Ubuntu
01:10:34.274 INFO  standalone-runner_0 io.kestra.executor.DefaultExecutor Executor started with 12 thread(s)
01:10:35.377 INFO  standalone-runner_1 i.kestra.scheduler.DefaultScheduler Scheduler started with 12 thread(s) [timezone=GMT]
01:10:35.748 INFO  standalone-runner_2 io.kestra.worker.AbstractWorker Worker started with 12 thread(s)

其中 Machine information 一行的 max memory 是 JVM 可用堆上限:默认未配置 -Xmx 时,JVM 按 -XX:MaxRAMPercentage=50.0(物理内存的一半)取值,本文环境物理内存 31GiB,因此显示 16032MB。如何把堆内存收敛到 512MB 见第七章(systemd 单元的 JAVA_OPTS)。server local 会以单进程多角色模式启动(日志中可依次看到 Executor、Scheduler、Worker 的启动行)。

5.2 后台启动(nohup 方式,临时使用)

cd /opt/kestra
JAVA_OPTS="-Xms256m -Xmx512m" nohup ./kestra-2.0.6 server local > /var/log/kestra-local.log 2>&1 &

命令无输出(nohup 后台化)。查看进程确认:

ps -ef | grep java

回显(单行,已折行展示):

root        1130       1  4 00:44 ?        00:01:09 java -XX:MaxRAMPercentage=50.0 -Xms256m -Xmx512m --add-opens java.base/java.nio=ALL-UNNAMED --add-opens java.base/java.util=ALL-UNNAMED --add-opens java.base/java.lang=ALL-UNNAMED --sun-misc-unsafe-memory-access=allow --enable-native-access=ALL-UNNAMED -jar ./kestra-2.0.6 server local --config /opt/kestra/confs/application.yaml

可以看到 JAVA_OPTS 中的 -Xms256m -Xmx512m 已生效——Kestra 启动脚本会把它插到自身默认参数 -XX:MaxRAMPercentage 之后。再确认监听端口:

ss -tln | grep 8080

回显:

LISTEN 0    4096    *:8080    *:*

(ss 未安装时先执行 apt-get install -y iproute2。)

5.3 健康验证

curl -s -o /dev/null -w "root=%{http_code}\n" http://localhost:8080/
curl -s -o /dev/null -w "ping=%{http_code}\n" http://localhost:8080/ping

回显:

root=307
ping=200
  • / 返回 307 重定向到 Web UI 的登录/首页,属正常;
  • /ping 返回 200 表示服务存活。

⚠️ 排障实录:默认未配置认证时,直接访问业务 API 同样要求登录,返回 401 与一段 JSON 报错,这不是故障:

curl -s -o /dev/null -w "%{http_code}\n" http://localhost:8080/api/v1/configs

401
{"message":"Unauthorized","_embedded":{"errors":[{"message":"Unauthorized"}]}}

配置用户名密码后用 -u 携带凭证即可通过(见第八章)。

六、创建系统用户与目录规划

用 root 直接跑常驻服务不是好习惯,创建专用系统用户并规划目录:

useradd -r -s /usr/sbin/nologin kestra
id kestra
mkdir -p /opt/kestra/confs /opt/kestra/data /opt/kestra/plugins /opt/kestra/flows
chown -R kestra:kestra /opt/kestra
ls -ld /opt/kestra /opt/kestra/confs /opt/kestra/data /opt/kestra/plugins

回显:

uid=999(kestra) gid=999(kestra) groups=999(kestra)

drwxr-xr-x 5 kestra kestra 4096 Oct 17 01:17 /opt/kestra
drwxr-xr-x 2 kestra kestra 4096 Oct 17 01:17 /opt/kestra/confs
drwxr-xr-x 2 kestra kestra 4096 Oct 17 01:17 /opt/kestra/data
drwxr-xr-x 2 kestra kestra 4096 Oct 17 01:17 /opt/kestra/plugins

目录用途:

目录用途
/opt/kestrakestra-2.0.6 主程序所在目录
/opt/kestra/confsapplication.yaml 配置文件
/opt/kestra/data内嵌 H2 数据库、日志与本地存储数据
/opt/kestra/plugins运行期自动下载的插件 jar
/opt/kestra/flows本地 Flow 定义文件(配合 CLI 校验/导入)

七、systemd 托管(开机自启)

7.1 编写服务单元

cat > /etc/systemd/system/kestra.service <<'EOF'
[Unit]
Description=Kestra Event-Driven Declarative Orchestrator
Documentation=https://kestra.io/docs/
After=network-online.target

[Service]
Type=simple
ExecStart=/bin/sh /opt/kestra/kestra-2.0.6 server local --config /opt/kestra/confs/application.yaml
Environment="JAVA_OPTS=-Xms256m -Xmx512m"
WorkingDirectory=/opt/kestra
Environment=KESTRA_PLUGINS_PATH=/opt/kestra/plugins
Restart=always
RestartSec=5
KillMode=mixed
TimeoutStopSec=150
SuccessExitStatus=143
SyslogIdentifier=kestra
User=kestra
Group=kestra

[Install]
WantedBy=multi-user.target
EOF

命令无输出。

💡 技术拓展:三个容易踩坑的单元字段—— ① Environment="JAVA_OPTS=-Xms256m -Xmx512m" 的引号不能省:systemd 里 Environment=NAME=value 不加引号时,值中第一个空格之后的内容会被当作第二个变量定义,实测曾出现 -Xmx512m 被静默丢弃、JVM 只拿到 -Xms256m 的故障; ② SuccessExitStatus=143:Kestra 收到 SIGTERM 优雅退出时返回 143(128+15),不声明会被 systemd 记为 failed; ③ TimeoutStopSec=150:Kestra 关停时要等调度/执行任务收尾,默认 90 秒有时不够,实测完整退出约需 8~12 秒,留 150 秒余量。 注意:systemd 单元一次只托管一个单元(本篇只建 kestra.service);如需同时管理 PostgreSQL,单独为其建立单元。

7.2 写入基础配置文件

服务单元引用了 /opt/kestra/confs/application.yaml,先创建它(详细参数含义见《Kestra 2.0.6 配置参数详解》):

cat > /opt/kestra/confs/application.yaml <<'EOF'
kestra:
  server:
    basic-auth:
      username: admin@example.com
      password: q1w2E3r4
  anonymous-usage-report:
    enabled: false
EOF
chown -R kestra:kestra /opt/kestra/confs

命令无输出。

💡 技术拓展:Kestra 用户名必须是邮箱格式(UI 登录与 Basic 认证都按邮箱校验)。密码实测规则:包含大小写与数字的组合(如 q1w2E3r4)可正常通过认证;改成全小写弱密码 q1w2e3r4 后服务能启动,但 Basic 认证会返回 401(后文 6.5 验证)。

7.3 启动并设置开机自启

systemctl daemon-reload
systemctl enable kestra
systemctl start kestra

enable 回显:

Created symlink /etc/systemd/system/multi-user.target.wants/kestra.service → /etc/systemd/system/kestra.service.

start 无输出。等待约 40 秒完成首次初始化后验证:

systemctl is-enabled kestra
systemctl is-active kestra
systemctl status kestra --no-pager

回显:

enabled

active

● kestra.service - Kestra Event-Driven Declarative Orchestrator
     Loaded: loaded (/etc/systemd/system/kestra.service; enabled; vendor preset: enabled)
     Active: active (running) since Sat 2026-10-17 00:33:47 UTC; 42s ago
       Docs: https://kestra.io/docs/
   Main PID: 413 (java)
      Tasks: 127 (limit: 5753)
     Memory: 695.6M
        CPU: 24.938s
     CGroup: /system.slice/kestra.service
             └─413 java -XX:MaxRAMPercentage=50.0 -Xms256m -Xmx512m --add-opens=java.base/java.nio=ALL-UNNAMED ... server local --config /opt/kestra/confs/application.yaml

7.4 验证 JVM 参数生效

ps -ef | grep java | grep -v grep

回显(单行,已折行展示):

kestra      1821       1  9 01:13 ?        00:00:38 java -XX:MaxRAMPercentage=50.0 -Xms256m -Xmx512m --add-opens java.base/java.nio=ALL-UNNAMED --add-opens java.base/java.util=ALL-UNNAMED --add-opens java.base/java.lang=ALL-UNNAMED --sun-misc-unsafe-memory-access=allow --enable-native-access=ALL-UNNAMED -jar /opt/kestra/kestra-2.0.6 server local --config /opt/kestra/confs/application.yaml

-Xms256m -Xmx512m 出现在参数串中,说明 systemd 注入的 JAVA_OPTS 已被启动脚本读取。再从运行日志交叉验证堆上限:

journalctl -u kestra --no-pager | grep -a "Machine information" | tail -1

回显:

Oct 17 01:13:41 0e4bc4c3ce89 kestra[1821]: 01:13:41.078 INFO  main         i.k.c.c.s.AbstractServerCommand Machine information: 12 available cpu(s), 512MB max memory, Java version 25.0.4.1+1-1-22.04.4-Ubuntu

512MB max memory 与 -Xmx512m 一致,闭环确认。也可用 jps -v(JDK 自带)得到同样的参数串。

⚠️ 排障实录:曾实测把 unit 写成不带引号的 Environment=JAVA_OPTS=-Xms256m -Xmx512m,重启后 ps -ef 里只剩 -Xms256m,日志 Machine information 显示 16032MB(默认物理内存一半)——空格被 systemd 当作变量分隔符,-Xmx512m 整体丢失且无任何告警。修复为引号包裹形式后恢复正常。

7.5 认证行为验证

curl -s -o /dev/null -w "noauth=%{http_code}\n" http://localhost:8080/api/v1/configs
curl -s -o /dev/null -w "auth=%{http_code}\n" -u admin@example.com:q1w2E3r4 http://localhost:8080/api/v1/configs

回显:

noauth=401

auth=200

携带凭证后返回 200,Web UI(浏览器访问 http://<服务器IP>:8080)也用同一组邮箱+密码登录。

⚠️ 排障实录:把配置中的密码临时改成弱密码 q1w2e3r4 并重启后,服务状态仍是 active,但同一接口用新密码认证返回 401——Kestra 2.0.6 不在启动期校验密码复杂度,而是登录期按内置规则拒绝弱密码。恢复 q1w2E3r4 后认证恢复 200。排障时若"服务正常但登录不上",先检查密码是否包含大小写与数字组合。

7.6 日志与日常管理

journalctl -u kestra --no-pager -n 3

回显:

Oct 17 00:02:16 0e4bc4c3ce89 kestra[43]: 00:02:16.576 INFO  scheduler-scheduling-loop_3 i.kestra.scheduler.TriggerScheduler Starting trigger scheduling for [3, 15] vNodes
Oct 17 00:02:16 0e4bc4c3ce89 kestra[43]: 00:02:16.155 INFO  scheduler-scheduling-loop_4 i.kestra.scheduler.TriggerScheduler Starting trigger scheduling for [4] vNodes
Oct 17 00:02:16 0e4bc4c3ce89 kestra[43]: 00:02:16.655 INFO  scheduler-scheduling-loop_2 i.kestra.scheduler.TriggerScheduler Starting trigger scheduling for [1] vNodes

日常管理命令:

systemctl restart kestra   # 重启(优雅停启,实测全程约 25 秒)
systemctl stop kestra      # 停止
systemctl status kestra    # 查看状态

⚠️ 排障实录:服务异常时优先 journalctl -u kestra -n 200 --no-pager 查日志,其次检查 /opt/kestra/confs/application.yaml 配置语法(H2 数据库文件锁问题见下文 8.1)。

八、常见问题(FAQ)

8.1 启动报 Database may be already in use

进程未完全退出就再次启动时,实测报错(启动输出节选):

Message: Failed to initialize pool: Database may be already in use: "/opt/kestra/data/database.mv.db". Possible solutions: close all other connection(s); use the server mode [90020-240]
Path Taken:

原因:H2 数据库文件被上一个实例的连接占用(默认 H2 只允许单进程独占)。处理:确认旧进程已退出(ps -ef | grep java、jps -l)后再启动;必要时等待 10~30 秒让文件锁释放。这也是建议用 systemd 托管(KillMode=mixed + 优雅停等)而非手工 kill 的原因。

8.2 端口 8080 被占用

服务起不来时,先确认 8080 端口是否已被其他进程占用:ss -tln | grep 8080。若 8080 需要留给其他服务,可在 application.yaml 中修改端口:

micronaut:
  server:
    port: 8082

实测改完后重启,ss -tln | grep 808 确认新端口已监听、原 8080 不再监听:

LISTEN 0    4096    *:8082    *:*

API 与 Web UI 一并迁移到 8082。注意 Kestra Flow 内通过 http://localhost:8080 调用自身 API 的任务要同步改端口。

8.3 忘记/需要修改管理密码

直接编辑 /opt/kestra/confs/application.yaml 中的 kestra.server.basic-auth.password,然后 systemctl restart kestra。新密码需包含大小写字母与数字的组合(实测 q1w2E3r4 通过、q1w2e3r4 认证 401)。

8.4 systemd 服务反复重启(exit status 217/USER)

服务单元里的 User=kestra 指向的用户被删除后(例如误执行了 userdel -r kestra),systemd 无法切换用户,服务进入重启循环,journalctl -u kestra --no-pager -n 6 实测回显:

kestra.service: Failed with result 'exit-code'.
kestra.service: Scheduled restart job, restart counter is at 14.
Stopped Kestra Event-Driven Declarative Orchestrator.
Started Kestra Event-Driven Declarative Orchestrator.
kestra.service: Main process exited, code=exited, status=217/USER
kestra.service: Failed with result 'exit-code'.

status=217/USER 即"切换用户失败"。处理:重建用户并恢复目录属主后重启服务:

useradd -r -s /usr/sbin/nologin kestra
chown -R kestra:kestra /opt/kestra
systemctl restart kestra

重建后 id kestra 回显 uid=999(kestra) ...(与删除前一致的 UID,因为系统用户 UID 回收复用),服务恢复正常。

8.5 升级

停止服务、替换二进制文件、重启即可,Kestra 启动时自动完成数据库结构迁移。完整的 2.0.5 → 2.0.6 升级实测(含数据连续性验证、备份与回滚预案)见《Kestra 2.0.6 进阶实战与运维》。

九、卸载

9.1 停止并禁用服务

systemctl disable kestra
systemctl stop kestra
systemctl is-active kestra

disable 回显:

Removed /etc/systemd/system/multi-user.target.wants/kestra.service.

stop 无输出,is-active 回显 inactive。

9.2 删除服务单元与用户

rm -f /etc/systemd/system/kestra.service
systemctl daemon-reload
userdel -r kestra

userdel -r kestra 回显:

userdel: kestra mail spool (/var/mail/kestra) not found
userdel: kestra home directory (/home/kestra) not found

(系统用户创建时未指定 home 与邮箱,这两行提示属正常。)

9.3 删除程序与数据

rm -rf /opt/kestra
rm -f /var/log/kestra-local.log

9.4 卸载 JDK(可选)

apt-get purge -y openjdk-25-jdk-headless openjdk-25-jre-headless
apt-get autoremove -y

purge 回显(节选):

update-alternatives: using /usr/lib/jvm/java-11-openjdk-amd64/bin/pack200 to provide /usr/bin/pack200 (pack200) in auto mode
update-alternatives: using /usr/lib/jvm/java-11-openjdk-amd64/bin/unpack200 to provide /usr/bin/unpack200 (unpack200) in auto mode
update-alternatives: using /usr/lib/jvm/java-11-openjdk-amd64/lib/jexec to provide /usr/bin/jexec (jexec) in auto mode
Setting up default-jre-headless (2:1.11-72build2) ...
(Reading database ... 6967 files and directories currently installed.)
Purging configuration files for openjdk-25-jre-headless:amd64 (25.0.4.1+1-1~22.04.4) ...

(purge 过程中 alternatives 自动把 pack200 等命令指向机器上剩余的 openjdk-11——本机另装了 openjdk-11,读者机器若无其他 JDK 则无这些行。)

autoremove 回显(节选):

Running hooks in /etc/ca-certificates/update.d...

updates of cacerts keystore disabled.
done.
Processing triggers for libc-bin (2.35-0ubuntu3.15) ...

最终验证:

java -version
ls /opt/

回显:

bash: line 1: java: command not found

(ls /opt/ 无输出,目录已清空。)

至此 Kestra 及其运行环境完全卸载。若曾通过 systemd 方式运行过,还需确认 /var/log/journal 下历史日志按需清理(journalctl --vacuum-time=7d 可清理 7 天前日志)。

十、参考链接