systemd systemctl ExecStart超时处理

Job for xxx.service failed because a timeout was exceeded. See "systemctl status leanote.service" and "journalctl -xe" for details.

在CentOS上编写自定义启停服务脚本时,有时脚本文件中特意设置很长的等待时间或要完成任务的时间本身就很长,例如下面的脚本:

while true
do
  echo 'trying netcat'
  # do something
  sleep 300s
done

如果在后台服务脚本中直接执行该脚本,就会收到超时信息,服务自动终止,这是我所不希望看到的:

[Unit]
Description=leanote.service
After=network.target mongod.service

[Service]
Type=forking
ExecStart=/data/leanote/bin/run.sh
ExecStop=/bin/kill -SIGINT $MAINPID
ExecReload=/bin/kill -USR2 $MAINPID

[Install]
WantedBy=multi-user.target

执行“systemctl status 服务名”查看服务状态,可以看到由于systemd一直在等待run.sh脚本执行完成,但超时时间到了,自动结束了服务:leanote.service start operation timed out. Terminating.

# systemctl status leanote.service 
● leanote.service
   Loaded: loaded (/usr/lib/systemd/system/leanote.service; enabled; vendor preset: disabled)
   Active: failed (Result: timeout) since 五 2020-12-04 21:32:28 CST; 2min 24s ago
  Process: 4279 ExecStart=/data/leanote/bin/run.sh & (code=killed, signal=TERM)

12月 04 21:30:58 db-srv run.sh[4279]: DEBUG 21:30:58  revel controller_type.go:64: Registered controller: App\memberindex    section=controller
12月 04 21:30:58 db-srv run.sh[4279]: DEBUG 21:30:58  revel controller.go:523: RegisterController:Registered controller  section=controller controller=App\\memberindex
12月 04 21:30:58 db-srv run.sh[4279]: DEBUG 21:30:58  revel controller_type.go:64: Registered controller: App\memberuser     section=controller
12月 04 21:30:58 db-srv run.sh[4279]: DEBUG 21:30:58  revel controller.go:523: RegisterController:Registered controller  section=controller controller=App\\memberuser
12月 04 21:30:58 db-srv run.sh[4279]: DEBUG 21:30:58  revel server.go:106: InitServerEngine: Found server engine and invoking  section=server name=go
12月 04 21:30:58 db-srv run.sh[4279]: Listening on.. 0.0.0.0:9000
12月 04 21:32:28 db-srv systemd[1]: leanote.service start operation timed out. Terminating.
12月 04 21:32:28 db-srv systemd[1]: Failed to start leanote.service.
12月 04 21:32:28 db-srv systemd[1]: Unit leanote.service entered failed state.
12月 04 21:32:28 db-srv systemd[1]: leanote.service failed.

解决这个问题也很简单,借助“bash -c”,bash -c的作用是将一个长字符串当做一条完整的命令来执行,如果在脚本路径后面加上后台运行符号(&),run.sh脚本就会在后台运行,不会一直处于挂起状态,systemd也就不会一直等待run.sh执行完成了。经过测试,完全符合预期,因此,最终的解决方案是:

ExecStart=/bin/bash -c "/data/leanote/bin/run.sh &"

 

`/lib/systemd/system/docker.service` 文件是 Docker 服务的 `systemd` 单元文件,用于在 Ubuntu 系统上将 Docker 服务注册为系统服务。以下是该文件的默认内容: ``` [Unit] Description=Docker Application Container Engine Documentation=https://docs.docker.com After=network-online.target docker.socket firewalld.service Wants=network-online.target Requires=docker.socket [Service] Type=notify ExecStart=/usr/bin/dockerd -H fd:// ExecReload=/bin/kill -s HUP $MAINPID LimitNOFILE=1048576 LimitNPROC=infinity LimitCORE=infinity TimeoutStartSec=0 Restart=on-abnormal [Install] WantedBy=multi-user.target ``` 该文件包含三个部分: 1. `[Unit]` 部分定义了 Docker 服务的说明、文档链接和启动顺序。在这个示例中,`After` 配置项指定了 Docker 服务在 `network-online.target`、`docker.socket` 和 `firewalld.service` 后启动,`Wants` 配置项指定了 Docker 服务必须在 `network-online.target` 启动之后启动。 2. `[Service]` 部分定义了 Docker 服务的启动方式和配置。在这个示例中,`ExecStart` 配置项指定了 Docker 服务启动时使用的命令行参数,`LimitNOFILE`、`LimitNPROC` 和 `LimitCORE` 配置项指定了 Docker 服务的资源限制,`TimeoutStartSec` 配置项指定了 Docker 服务启动的超时时间,`Restart` 配置项指定了 Docker 服务在异常终止时自动重启。 3. `[Install]` 部分定义了 Docker 服务的安装位置和启用级别。在这个示例中,`WantedBy` 配置项指定了 Docker 服务在 `multi-user.target` 启动级别下启用。 如果您需要修改 `docker.service` 文件的配置信息,可以编辑该文件,然后使用 `systemctl daemon-reload` 命令重新加载 `systemd` 配置,以便新的配置生效。
评论 12
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值