AskOverflow.Dev

AskOverflow.Dev Logo AskOverflow.Dev Logo

AskOverflow.Dev Navigation

  • 主页
  • 系统&网络
  • Ubuntu
  • Unix
  • DBA
  • Computer
  • Coding
  • LangChain

Mobile menu

Close
  • 主页
  • 系统&网络
    • 最新
    • 热门
    • 标签
  • Ubuntu
    • 最新
    • 热门
    • 标签
  • Unix
    • 最新
    • 标签
  • DBA
    • 最新
    • 标签
  • Computer
    • 最新
    • 标签
  • Coding
    • 最新
    • 标签
主页 / server / 问题 / 965724
Accepted
Amandasaurus
Amandasaurus
Asked: 2019-05-04 01:33:20 +0800 CST2019-05-04 01:33:20 +0800 CST 2019-05-04 01:33:20 +0800 CST

如果单元名称已经存在,让“systemd-run”优雅地失败?

  • 772

我发现systemd-run它允许一个人在后台运行进程一次(“瞬态服务”)。我总是用--unit $NAME. 但是,如果我已经运行了systemd-run命令并且我的进程正在运行,那么systemd-run将失败,退出代码非零。无论如何,systemd-run在这种情况下,是否有更多的幂等性并且不会失败?

目前我正在做:

 systemctl is-active $NAME || systemd-run --unit $NAME $COMMAND

有没有更好的办法?

这是在 Ubuntu 18.04 上,使用当前的 systemd(版本 237?)

systemd
  • 3 3 个回答
  • 935 Views

3 个回答

  • Voted
  1. Best Answer
    Denis SkS
    2021-03-10T11:15:29+08:002021-03-10T11:15:29+08:00

    -G,--收集

    完成后卸载瞬态单元,即使它失败了。通常,如果没有此选项,所有运行和失败的单元都会保存在内存中,直到用户使用 systemctl reset-failed 或等效命令明确重置其失败状态。另一方面,成功运行的单元会立即卸载。如果启用此选项,则单元的“垃圾收集”会更加激进,并且无论它们成功退出还是失败都会卸载单元。此选项是 --property=CollectMode=inactive-or-failed 的快捷方式,有关详细信息,请参阅 systemd.unit(5) 中对 CollectMode= 的说明。

    systemd-run --collect --unit $NAME $COMMAND
    
    • 4
  2. Lacek
    2019-05-04T05:59:06+08:002019-05-04T05:59:06+08:00

    我认为没有办法不失败。

    这里的问题是 systemd 单元名称必须是唯一的。如果不是,那么操纵单位可能会变得模棱两可。出于这个原因,如果您尝试复制单位名称,systemd 会感知到错误,而且我认为没有办法让它不这么认为。

    如果您可以说服systemd-run以相同的名称运行第二个服务,如果您发出systemctl stop命令会发生什么?两个同名单位中的哪一个应该停止?你第一个跑的那个?最后?两个都?

    • 1
  3. Profpatsch
    2021-06-20T03:37:57+08:002021-06-20T03:37:57+08:00

    您需要--collect删除该单元(请参阅答案https://serverfault.com/a/1056478/161855)。

    $ systemctl is-active foo || systemd-run --collect --unit foo sleep 1000
    inactive
    Running as unit: foo.service
    $ systemctl is-active foo || systemd-run --collect --unit foo sleep 1000
    active
    

    这会引入轻微的TOCTOU,但总比没有好,并且systemd-run如果单元已经在运行,则不会导致打印错误。

    • 0

相关问题

  • SSH 会话在关机/重启时挂起

  • 我可以使用 systemd 重新启动依赖服务吗?

  • 让我的旧初始化脚本在 systemd 中工作的最简单方法是什么?

  • 在 CentOS 7 上为 systemd 启动的进程增加 nproc

Sidebar

Stats

  • 问题 205573
  • 回答 270741
  • 最佳答案 135370
  • 用户 68524
  • 热门
  • 回答
  • Marko Smith

    新安装后 postgres 的默认超级用户用户名/密码是什么?

    • 5 个回答
  • Marko Smith

    SFTP 使用什么端口?

    • 6 个回答
  • Marko Smith

    命令行列出 Windows Active Directory 组中的用户?

    • 9 个回答
  • Marko Smith

    什么是 Pem 文件,它与其他 OpenSSL 生成的密钥文件格式有何不同?

    • 3 个回答
  • Marko Smith

    如何确定bash变量是否为空?

    • 15 个回答
  • Martin Hope
    Tom Feiner 如何按大小对 du -h 输出进行排序 2009-02-26 05:42:42 +0800 CST
  • Martin Hope
    Noah Goodrich 什么是 Pem 文件,它与其他 OpenSSL 生成的密钥文件格式有何不同? 2009-05-19 18:24:42 +0800 CST
  • Martin Hope
    Brent 如何确定bash变量是否为空? 2009-05-13 09:54:48 +0800 CST
  • Martin Hope
    cletus 您如何找到在 Windows 中打开文件的进程? 2009-05-01 16:47:16 +0800 CST

热门标签

linux nginx windows networking ubuntu domain-name-system amazon-web-services active-directory apache-2.4 ssh

Explore

  • 主页
  • 问题
    • 最新
    • 热门
  • 标签
  • 帮助

Footer

AskOverflow.Dev

关于我们

  • 关于我们
  • 联系我们

Legal Stuff

  • Privacy Policy

Language

  • Pt
  • Server
  • Unix

© 2023 AskOverflow.DEV All Rights Reserve