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.conf
为90s
,但超时仍然发生。
有谁知道为什么它会在 60 秒超时?是否还有其他地方配置了此超时值?有什么方法可以检查吗?
该服务与 java 7 一起运行并对其进行守护,它使用JSVC。我-wait
用值配置了参数120
。
Kat*_*tie 98
由于启动需要多长时间,我的 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/
(见评论)使用TimeoutStartSec
,TimeoutStopSec
或TimeoutSec
(此处有更多信息)指定启动和停止进程的超时时间。之后,这就是我的 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)
systemctl show node.service -p TimeoutStartUSec
systemctl show node.service -p TimeoutStopUSec
systemctl show node.service -p TimeoutUSec
接下来,您需要重新加载 systemd systemctl reload node.service
systemctl start node.service
systemctl reboot
--no-block
选项systemctl像这样:systemctl --no-block start node.service
。这个选项在这里描述:“不要同步等待请求的操作完成。如果没有指定,作业将被验证、入队并且 systemctl 将等待直到单元的启动完成。通过传递这个参数,它仅经过验证和排队。”
systemctl mask
代替systemctl start
. 有关更多信息,请参见此处。评论更新:
TimeoutSec=infinity
:在这里不要使用“无穷大”,而是要花大量时间,例如TimeoutSec=900
(15 分钟)。如果应用程序需要“永远”退出,那么它可能会无限期地阻止重新启动。信用@Alexis Wilke 和@JCCyC/usr/lib/systemd/system
,而是尝试systemctl edit
或 edit/etc/systemd/system
来覆盖它们。您永远不应该编辑/usr/lib/
. 信用@ryeager 和@0xC0000022LCae*_*alf 12
运行systemctl show SERVICE_NAME.service -p TimeoutStopUSec
我至少可以看到 systemd 为我的服务设置的超时。
我将脚本更改为常规单元文件,以使其正常工作。
不要编辑包的服务文件(/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)
归档时间: |
|
查看次数: |
162725 次 |
最近记录: |