如何更改systemd服务超时值?

Cae*_*alf 62 centos systemd sysvinit

在我现在工作的公司中,有一个遗留服务,它的 init 脚本使用旧的 SysvInit,但运行在 systemd (CentOS 7) 上。

由于计算量很大,此服务大约需要 70 秒才能完成。我没有为 systemd 配置任何超时,也没有更改默认配置/etc/systemd/system.conf,但是当我执行service SERVICE stop我的服务时,我的服务在 60 秒后超时。

检查journalctl -b -u SERVICE.service我发现这个日志:

Sep 02 11:27:46 service.hostname systemd[1]: Stopping LSB: Start/Stop
Sep 02 11:28:46 service.hostname SERVICE[24151]: Stopping service: Error code: 255
Sep 02 11:28:46 service.hostname SERVICE[24151]: [FAILED]
Run Code Online (Sandbox Code Playgroud)

我已经尝试将DefaultTimeoutStopSec属性更改/etc/systemd/system.conf90s,但超时仍然发生。

有谁知道为什么它会在 60 秒超时?是否还有其他地方配置了此超时值?有什么方法可以检查吗?

该服务与 java 7 一起运行并对其进行守护,它使用JSVC。我-wait用值配置了参数120

Kat*_*tie 98

由于启动需要多长时间,我的 systemd 服务一直超时,所以这为我修复了它:

  1. 编辑您的 systemd 文件:
    • 对于现代版本systemd:运行systemctl edit --full node.service将“节点”替换为您的服务名称)。
      • 这将创建一个系统文件,/etc/systemd/system/node.service.d/该文件将覆盖/usr/lib/systemd/system/node.service. 这是配置系统文件的正确方法。有关如何使用的详细信息systemctl edit在这里
    • 直接编辑系统文件:我的系统文件在/usr/lib/systemd/system/node.service. 将“节点”替换为您的应用程序名称。但是,直接编辑文件是不安全的/usr/lib/systemd/(见评论)
  2. 使用TimeoutStartSec,TimeoutStopSecTimeoutSec此处有更多信息)指定启动和停止进程的超时时间。之后,这就是我的 systemd 文件的外观:

    [Unit]
    Description=MyProject
    Documentation=man:node(1)
    After=rc-local.service
    
    [Service]
    WorkingDirectory=/home/myproject/GUIServer/Server/
    Environment="NODE_PATH=/usr/lib/node_modules"
    ExecStart=-/usr/bin/node Index.js
    Type=simple
    Restart=always
    KillMode=process
    TimeoutSec=900
    
    [Install]
    WantedBy=multi-user.target
    
    Run Code Online (Sandbox Code Playgroud)
    • 您还可以通过运行其中任何一个来查看当前的超时状态(但您需要编辑您的服务以进行更改!请参阅第 1 步)。令人困惑的是,相关属性的名称中有一个“U”,表示微秒。有关更多信息,请参阅此 Github 问题
      • systemctl show node.service -p TimeoutStartUSec
      • systemctl show node.service -p TimeoutStopUSec
      • systemctl show node.service -p TimeoutUSec
  3. 接下来,您需要重新加载 systemd systemctl reload node.service

  4. 现在尝试启动您的服务 systemctl start node.service
  5. 如果这不起作用,请尝试重新启动 systemctlsystemctl reboot
  6. 如果没有工作,请尝试使用该--no-block选项systemctl像这样:systemctl --no-block start node.service。这个选项在这里描述:“不要同步等待请求的操作完成。如果没有指定,作业将被验证、入队并且 systemctl 将等待直到单元的启动完成。通过传递这个参数,它仅经过验证和排队。”
    • 还可以选择使用systemctl mask代替systemctl start. 有关更多信息,请参见此处

评论更新:

  • TimeoutSec=infinity:在这里不要使用“无穷大”,而是要花大量时间,例如TimeoutSec=900(15 分钟)。如果应用程序需要“永远”退出,那么它可能会无限期地阻止重新启动。信用@Alexis Wilke 和@JCCyC
  • 而不是 edit /usr/lib/systemd/system,而是尝试systemctl edit或 edit/etc/systemd/system来覆盖它们。您永远不应该编辑/usr/lib/. 信用@ryeager 和@0xC0000022L

  • `TimeoutSec=infinity`——这不可能无限期地阻止重启吗?如果该进程退出需要“永远”怎么办?我建议大量使用,例如“5min”,但可能不是“infinity”... (10认同)
  • 你不应该在 /usr/lib 中编辑服务文件,你应该在 /etc/systemd/system 中编辑或覆盖它们 (6认同)
  • 虽然建议的要点是合理的,但我必须同意@ryeager ...现代版本的`systemd` 提供`systemctl edit`(和`mask` 以蛮力禁用它们,而不是`disable`)那个目的。你永远不应该编辑 `/usr/lib/systemd` 中的文件。 (5认同)
  • `TimeoutSec=infinity` 在这里不起作用,我使用了 `TimeOutSec=900`(15 分钟)并保存了我的后验。-- 我需要在重新启动服务之前运行`systemctl daemon-reload`。 (3认同)

Cae*_*alf 12

运行systemctl show SERVICE_NAME.service -p TimeoutStopUSec我至少可以看到 systemd 为我的服务设置的超时。

我将脚本更改为常规单元文件,以使其正常工作。


Tom*_*ale 5

不要编辑包的服务文件(/usr/lib/systemd/system/该文件在包升级时将被覆盖),而是使用:

sudo EDITOR=/bin/vi systemctl edit <service-name>
Run Code Online (Sandbox Code Playgroud)

(是的,nano 是默认编辑器!哎呀!)

这将安全地编辑该文件/etc/systemd/system/service-name.service.d/override.conf

该文件只需包含:

[Service]
# Override default 90 second timeout in pathological conditions
TimeoutStopSec=5  # or whatever value you want
Run Code Online (Sandbox Code Playgroud)

输入以下命令查看整体效果:

systemctl cat <service-name>
Run Code Online (Sandbox Code Playgroud)