systemctl管理服务
本文最后更新于 2024年12月11日 上午
需求
eg.netmon 用户,在名为‘py12’的 conda 虚拟环境中,在/home/netmon/projects/iotdev/iotdev_flask 目录下,运行 flask 程序 flask_app.py
创建服务
1 |
|
1 |
|
下面是每部分的意义:
[Unit]
: 这个部分包含了服务的基本描述和依赖关系。-
Description
: 定义了服务的简短描述,这里是“Gunicorn instance to serve Flask App”,表示这是一个用来运行 Flask 应用的 Gunicorn 服务实例。 -
After
: 指定了服务的启动顺序,即在这个服务启动之前,网络服务必须已经启动和就绪。在这里,服务将在网络目标之后启动,这意味着只有当基本的网络连接已经建立后,Gunicorn 服务才会被启动。
-
[Service]
: 这个部分包含了服务的具体运行细节。-
User
和Group
: 指定服务将以哪个用户和用户组的身份运行。在这里,服务将以用户”netmon”和同名的用户组”netmon”的身份运行。 -
WorkingDirectory
: 设置了服务的工作目录,也就是 Gunicorn 将从哪里开始执行。这里是”/home/netmon/projects/iotdev/iotdev_flask”。 -
Environment
: 设置了环境变量,这对于确保 Gunicorn 能够找到正确的 Python 解释器和 conda 环境至关重要。这里的路径应指向您 Conda 环境下的 bin 目录。 -
ExecStart
: 指定了服务启动时要执行的命令。这里启动 Gunicorn,并指定了配置文件以及 Flask 应用的位置。 -
Restart
: 设定了服务的重启策略。在这里,如果服务意外终止,systemd 将总是尝试重新启动它。
-
[Install]
: 这个部分定义了服务安装的相关设置。-
WantedBy
: 指明了服务应该被哪些 target 所引用,以此来决定服务何时启动。在这里,服务被标记为在 multi-user.target 时启动,意味着在多用户界面(通常是在登录前)启动该服务。
-
加载服务
1 |
|
启动服务
1 |
|
设置开机自启动
1 |
|
查看运行状态
1 |
|
关闭服务
1 |
|
如果要使用普通用户来管理服务,可以在 ~/.config/systemd/user
下面注册服务,注意不可以在配置文件中指定 user 和 group,管理命令是 systemctl --user xxx
相对于使用 rc.local 来实现开机自启动,systemctl 有以下几个优势:
- 依赖关系管理:systemd 能够自动管理服务之间的依赖关系,确保服务按照正确的顺序启动。而 rc.local 则是在所有其他初始化脚本之后运行,无法保证服务间的依赖性。
- 更好的资源控制:systemd 允许对服务的资源使用进行限制,例如 CPU 时间和内存使用量,这对于系统管理和安全性至关重要。rc.local 中的脚本则没有这样的功能。
- 状态跟踪:systemd 能够记录服务的状态,这在故障排查时非常有用。rc.local 的脚本执行情况很难追踪。
- 更快的启动速度:systemd 支持并行启动服务,因此能显著加快系统的启动速度。相比之下,rc.local 只能串行执行脚本,影响启动速度。
- 统一性:systemd 提供了一种统一的方式来启动、停止、重启服务以及查看服务状态,使管理更加一致和简单。rc.local 是一种较旧的方法,可能不适用于所有的服务类型。
- 定时任务:systemd 提供了 timer 单元来执行定时任务,而 rc.local 仅适用于开机一次性执行的任务。
- 更丰富的命令行选项:systemctl 命令提供了丰富的选项来管理服务和单元文件,使得操作更加灵活。
- 按需启动:systemd 只有在需要时才启动服务,有助于节省资源和提高系统效率。rc.local 中的脚本则是每次开机都执行,不考虑是否需要。
- 集成日志管理:systemd 集成了日志管理系统,使得查看服务的日志变得更加方便,而 rc.local 执行的结果可能难以记录和追踪。
综上所述,systemd 提供了更强大、更灵活的服务管理方式,相较于 rc.local,它在系统管理方面提供了更多的便利性和可靠性。
systemctl管理服务
https://xinhaojin.github.io/2024/12/11/systemctl管理服务/