如何更改系统服务超时值?


33

在我现在正在工作的公司中,有一个旧版服务,它的初始化脚本使用的是旧的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]

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

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

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

Answers:


54

我的systemd服务由于要花费多长时间才能启动,因此一直超时,因此这对我来说是固定的:

  1. 编辑您的systemd文件:
    • 对于现代版本的systemd:运行systemctl edit --full node.service用您的服务名称替换“ node”)。
      • 这将在创建一个系统文件,/etc/systemd/system/node.service.d/该文件将覆盖位于的系统文件/usr/lib/systemd/system/node.service。这是配置系统文件的正确方法。有关如何使用的详细信息systemctl edit在这里
    • 直接编辑系统文件:对我来说,系统文件位于/usr/lib/systemd/system/node.service。用您的应用程序名称替换“节点”。但是,直接在中编辑文件并不安全/usr/lib/systemd/(请参阅评论)
  2. 使用TimeoutStartSecTimeoutStopSecTimeoutSec(更多信息点击这里)来指定超时应该是起停过程有多长。之后,这就是我的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
    
    • 您还可以通过运行以下任意一种来查看当前的超时状态(但您需要编辑服务以进行更改!请参见步骤1):
      • systemctl show node.service -p TimeoutStartSec
      • systemctl show node.service -p TimeoutStopSec
      • systemctl show node.service -p TimeoutSec
  3. 接下来,您需要重新加载systemd systemctl reload node.service
  4. 现在尝试通过以下方式启动服务 systemctl start node.service
  5. 如果那不起作用,请尝试使用以下命令重新引导systemctlsystemctl reboot
  6. 如果那不起作用,请尝试使用--no-blocksystemctl 的选项,如下所示:systemctl --no-block start node.service。此选项描述这里:“不同步等待请求的操作来完成。如果不指定,作业将被验证,排队和systemctl会等到该单元的启动完成后通过传递这样的说法,它仅经过验证和排队。”
    • 也可以使用systemctl mask代替的选项systemctl start。有关更多信息,请参见此处

评论更新:

  • TimeoutSec=infinity:此处不要使用“ infinity”,而是要花费大量时间,例如TimeoutSec=900(15分钟)。如果应用程序需要“永远”退出,则可能会无限期阻止重新启动。信用@Alexis Wilke和@JCCyC
  • 与其进行编辑/usr/lib/systemd/system,不如尝试systemctl edit或编辑/etc/systemd/system以覆盖它们。您永远不要在中编辑服务文件/usr/lib/。信用@ryeager和@ 0xC0000022L

8
TimeoutSec=infinity—难道这会无限期地阻止重新启动吗?如果该过程“永远”退出,该怎么办?我建议大量,例如5min,但可能不会infinity...
Alexis Wilke

6
您不应该在/ usr / lib中编辑服务文件,应该在/ etc / systemd / system中编辑或覆盖它们
ryeager

5
虽然建议的要旨是合理的,但我必须为此目的同意@ryeager ...现代版本的systemd要约systemctl edit(并mask使用蛮力来禁用它们,而不是disable)。您永远不要编辑中的文件/usr/lib/systemd
0xC0000022L

3
TimeoutSec=infinity在这里没有用,我用了TimeOutSec=90015分钟,这节省了我的后路。- systemctl daemon-reload在重新启动服务之前,我需要先运行。
JCCyC

10

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

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

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.