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 / 问题 / 936220
Accepted
Markus Miller
Markus Miller
Asked: 2018-10-19 11:22:12 +0800 CST2018-10-19 11:22:12 +0800 CST 2018-10-19 11:22:12 +0800 CST

什么可能导致 systemd 服务停止并以作业被取消而结束?

  • 772

偶尔停止使用它的 systemd 服务时systemctl stop test-server会失败,提示作业已被取消:

Unable to stop service test-server: Job for test-server.service canceled.

什么可能导致服务停止被取消?

注意:停止实际上是从 Ansible playbook 启动的,但看不出它是如何相关的。

systemd
  • 2 2 个回答
  • 5948 Views

2 个回答

  • Voted
  1. Best Answer
    Jonathan Kowalski
    2019-02-05T08:54:02+08:002019-02-05T08:54:02+08:00

    systemd 中的每个单元在内部都有一个作业槽,并且一次只能为该单元安装一个作业。作业一般封装了单位的状态更改请求,但其效果因单位类型而异。在服务中,它们可能会启动状态更改请求,但即使您取消已安装的作业(或取消并替换为另一种作业类型,这将使​​另一个作业类型保持等待状态,直到该操作完成,该操作仍可能运行,因为unit_start/stop 函数内部也可以决定某个作业何时可运行)。

    例如,如果您有一个需要很长时间的停止操作,则在停止作业运行时调用 start 将使用默认作业模式(替换)取消已安装/正在运行的停止作业,并在单元的职位空缺。由于 unit_stop 之前已经启动了到 deactivating 的转换(以及映射到服务内部子状态的任何内容 - stop、stop-sigterm、stop-sigkill、stop-final、stop-final-sigterm、stop-final-sigkill),unit_start 现在将return -EAGAIN,这导致 systemd 将启动作业置于 JOB_WAITING 状态,并在下一次状态更改时将其添加到运行队列中,检查是否再次可运行,并根据结果再次运行或进入等待状态(来自单元通知)。每次运行作业时,它都会从运行队列中删除。

    这是这里对一些活动部分的概述。关于作业需要记住三件事:它们有一个类型(开始、停止、重新启动、重新加载等)、一个结果(超时、完成、取消、依赖、跳过等)和一个模式(替换、隔离、冲洗等)。模式适用于整个事务(所请求的作业及其要求以及以一致方式一起应用的传播相关作业),有关于它们各自做什么的文档。

    在您的特定情况下,似乎当您执行 systemctl stop 时,另一个作业进入并替换您的停止作业,并且 systemctl 客户端断开连接,因为它排队的作业被取消。这可能是由于某种依赖性,或其他原因(如 ExecStop= 最终调用 systemctl start 单元(仅在第一次工作)或类似的东西,或者想要/要求/绑定到同一单元的单元启动触发启动替换您触发的停止作业的作业等)。它可能是一个被套接字激活的服务,并且由于连接繁忙,被重新触发,由于套接字单元中的 Triggers= 依赖项将启动作业排入队列,从而取消您的停止作业。它也可能是一个计时器或其他东西:简而言之,由于其他一些工作进入并替换它,停止工作正在被替换。

    当然,正如您所注意到的,这一切都容易发生比赛,它可能会发生也可能不会发生,所以在您的情况下偶尔会发生。最好检查您的设置以避免这些问题。

    • 9
  2. nh2
    2020-04-28T14:34:45+08:002020-04-28T14:34:45+08:00

    就我而言,我得到了

    [root@server:~]# systemctl start nginx
    Job for nginx.service canceled.
    

    原因是我已经将 nginx 定义BindsTo=为拥有另一个服务,以便它在另一个服务运行时准确运行。

    由于一个bug,某天另一个服务立即开始退出,导致systemd取消了nginx的启动作业。

    不幸的是,systemd 似乎没有进一步说明取消的原因——我觉得如果它这样做会更好(而且我已经要求它)。

    • 3

相关问题

  • 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