systemd systemctl ExecStart超时处理

本文介绍了一个在CentOS上自定义服务脚本遇到的超时问题及其解决方案。通过修改服务脚本启动方式,使服务能在后台运行,避免了因执行时间过长导致的systemd超时终止。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

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 &"

 

<think>嗯,用户想了解如何使用systemctl管理MySQL服务,包括启动、停止、重启这些操作。我需要根据提供的引用资料来组织回答。首先,我需要确认用户可能的需求。用户可能刚安装完MySQL,尤其是通过源码或者二进制安装,这时候需要配置systemctl来管理服务。因为默认情况下,源码安装可能不会自动生成systemctl的服务文件,所以用户需要手动创建。 根据引用[2]和引用[3],服务文件通常存放在/usr/lib/systemd/system/目录下,比如mysql.service。用户需要创建这个文件,并正确配置ExecStart路径、配置文件路径,以及User和Group等参数。需要提醒用户根据实际安装路径修改这些参数,否则服务可能无法启动。 然后,用户可能需要知道如何创建和配置这个服务文件。引用[2]中的示例展示了服务文件的内容,包括Unit、Service和Install部分。需要强调用户必须修改ExecStart的路径,比如/usr/local/mysql/bin/mysqld,以及--defaults-file指定的配置文件位置,比如/etc/my.cnf。同时,用户和组设置为mysql,这需要提前创建好mysql用户,并确保数据目录的权限正确,如引用[5]提到的权限设置。 接下来是systemctl的基本操作,如启动、停止、重启,这些在引用[4]中提到。需要列出具体的命令,比如systemctl start mysql,并说明每个命令的作用。此外,还需要包括查看状态和设置开机启动的命令,这有助于用户管理服务状态和确保MySQL随系统启动。 用户可能遇到的问题包括服务启动失败,这时候需要查看日志,使用journalctl -xe或者查看MySQL的错误日志。引用[3]提到如果服务意外停止,systemctl会尝试重启,但用户可能需要手动排查原因,比如配置文件错误或权限问题。 权限设置也很重要,如引用[5]中提到的修改服务文件的权限为644,所有者是root,这可以防止未授权的修改。同时,MySQL的数据目录权限需要正确设置,确保mysql用户有读写权限,否则服务无法启动。 用户可能还会想知道如何验证服务是否配置正确,比如通过systemctl status查看运行状态,或者使用mysql客户端连接测试。此外,提醒用户在修改服务文件后需要执行systemctl daemon-reload,否则更改不会生效。 最后,生成相关问题时要考虑用户可能的后续疑问,比如配置参数的具体含义,如何排查启动失败,或者优化性能的配置。例如,引用[3]提到的LimitNOFILE设置为无限大,用户可能想知道这个参数的作用以及如何调整。</think>### 使用 systemctl 管理 MySQL 服务的操作指南 #### 一、配置 systemctl 服务文件 1. **创建服务文件** 在 `/usr/lib/systemd/system/` 目录下新建 `mysql.service` 文件(需管理员权限)[^2]: ```bash sudo vim /usr/lib/systemd/system/mysql.service ``` 2. **配置服务内容** 根据 MySQL 安装路径和配置文件位置修改以下内容[^2][^3]: ```ini [Unit] Description=MySQL Server After=network.target [Service] Type=simple User=mysql Group=mysql ExecStart=/usr/local/mysql/bin/mysqld --defaults-file=/etc/my.cnf Restart=on-failure RestartSec=10 LimitNOFILE=65535 [Install] WantedBy=multi-user.target ``` - `ExecStart`:指定 MySQL 启动命令和配置文件路径 - `User/Group`:确保 MySQL 以专用用户身份运行(需提前创建) - `LimitNOFILE`:设置文件描述符数量限制(建议调高或设为无限)[^3] 3. **设置文件权限** 修改服务文件权限并重载配置[^5]: ```bash sudo chmod 644 /usr/lib/systemd/system/mysql.service sudo systemctl daemon-reload ``` #### 二、基础服务管理命令 | 操作 | 命令 | 说明 | |---------------|-------------------------------|----------------------------------------------------------------------| | **启动服务** | `sudo systemctl start mysql` | 立即启动 MySQL 服务 | | **停止服务** | `sudo systemctl stop mysql` | 安全关闭 MySQL 进程(需等待事务完成) | | **重启服务** | `sudo systemctl restart mysql`| 先停止再启动(适用于配置文件修改后生效) | | **查看状态** | `systemctl status mysql` | 检查运行状态、进程 ID 和日志摘要 | | **开机自启** | `sudo systemctl enable mysql` | 添加至系统启动项(成功后显示 `Created symlink...`) | #### 三、常见问题排查 1. **服务启动失败** - 使用 `journalctl -xe` 查看实时日志 - 检查 MySQL 错误日志(默认路径:`/var/log/mysql/error.log`) 2. **权限问题** - 确保 MySQL 数据目录(如 `/var/lib/mysql`)的所有者为 `mysql:mysql` - 执行权限修复: ```bash sudo chown -R mysql:mysql /var/lib/mysql ``` #### 四、进阶配置建议 1. 修改 `Restart=always` 实现自动恢复(需搭配 `RestartSec=3` 避免频繁重启)[^3] 2. 通过 `TimeoutStartSec=30` 延长启动超时时间(适用于大型数据库初始化) 3. 使用 `PrivateTmp=true` 隔离临时目录增强安全性
评论 12
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值