Skip to content

[cosh-ng] svc --dry-run 对不存在的服务返回失败,与 pkg --dry-run 语义不一致 #1361

Description

@zhangtaibo

环境

  • 组件:cosh-ng
  • 版本:0.11.0
  • 测试环境:Linux x86_64 (Alinux 4)

复现步骤

  1. 执行 cosh-cli svc start <不存在的服务名> --dry-run
  2. 观察 JSON 输出
  3. 对比 cosh-cli pkg install <不存在的包名> --dry-run

预期

  • svc 的 --dry-run 应返回 ok=true,与 pkg 一致(dry-run 不查前置存在性,仅预演)

实际

  • svc 返回 ok=false,error.code=SvcNotFound,error.message="Service '<name>' not found (unit not loaded)"
  • pkg 返回 ok=true(dry-run 短路,不查存在性)

根因(源码定位)

crates/cosh-platform/src/svc.rs svc_action()if dry_run { return Ok(...) } 短路之前调用 svc_status(name)?,导致服务不存在时直接返回 Err,绕过 dry-run 短路:

pub fn svc_action(name: &str, action: &str, dry_run: bool) -> Result<...> {
    // ...
    // Get current state before action
    let before = svc_status(name)?;          // ← 查存在性,不存在则 Err
    let previous_state = before.state.clone();

    if dry_run {
        return Ok(SvcActionResult { ... });  // ← dry-run 短路在此,但已被前面 Err 拦截
    }
    // ...
}

对比 crates/cosh-platform/src/pkg.rs pkg_install(),dry-run 短路在最前,不查存在性:

pub fn pkg_install(distro, package, dry_run) -> Result<...> {
    let mgr = distro.pkg_manager();
    let (cmd, args) = match mgr { ... };

    if dry_run {
        return Ok(PkgInstallResult { ... });  // ← dry-run 短路在最前
    }
    // ...
}

影响

  • Agent 用 svc <action> --dry-run 预演时会拿到失败信号,误以为后续真实操作也会失败,可能放弃或改变工作流
  • dry-run 契约在 pkg 与 svc 子域之间不对称,违反 README 承称的"执行前预览"语义
  • 同样问题影响 start / stop / restart / enable / disable 所有 svc 子命令

复现稳定性

3/3 稳定复现

修复建议

svc_actionlet before = svc_status(name)?; 移到 if dry_run { return Ok(...) } 之后;dry-run 分支的 previous_stateSvcState::Unknown("(dry-run)")SvcState::NotFound 占位,不实际调用 systemctl。

分类建议

PRODUCT_BUG

Metadata

Metadata

Assignees

Type

No type

Fields

No fields configured for issues without a type.

Projects

No projects

Milestone

No milestone

Relationships

None yet

Development

No branches or pull requests

Issue actions