systemctl管理服务

本文最后更新于 2024年12月11日 上午

需求

eg.netmon 用户,在名为‘py12’的 conda 虚拟环境中,在/home/netmon/projects/iotdev/iotdev_flask 目录下,运行 flask 程序 flask_app.py

创建服务

1
sudo vi /etc/systemd/system/iot_flask.service
1
2
3
4
5
6
7
8
9
10
11
12
13
14
[Unit]
Description=Gunicorn instance to serve Flask App
After=network.target

[Service]
User=netmon
Group=netmon
WorkingDirectory=/home/netmon/projects/iotdev/iotdev_flask
Environment="PATH=/home/netmon/.conda/envs/py12/bin"
ExecStart=/home/netmon/.conda/envs/py12/bin/python flask_app.py
Restart=always

[Install]
WantedBy=multi-user.target

下面是每部分的意义:

  • [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
sudo systemctl daemon-reload

启动服务

1
sudo systemctl start iot_flask.service

设置开机自启动

1
sudo systemctl enable iot_flask.service

查看运行状态

1
sudo systemctl status iot_flask.service

关闭服务

1
sudo systemctl stop iot_flask.service

如果要使用普通用户来管理服务,可以在 ~/.config/systemd/user ​下面注册服务,注意不可以在配置文件中指定 user 和 group,管理命令是 systemctl --user xxx

相对于使用 rc.local 来实现开机自启动,systemctl 有以下几个优势:

  1. 依赖关系管理:systemd 能够自动管理服务之间的依赖关系,确保服务按照正确的顺序启动。而 rc.local 则是在所有其他初始化脚本之后运行,无法保证服务间的依赖性。
  2. 更好的资源控制:systemd 允许对服务的资源使用进行限制,例如 CPU 时间和内存使用量,这对于系统管理和安全性至关重要。rc.local 中的脚本则没有这样的功能。
  3. 状态跟踪:systemd 能够记录服务的状态,这在故障排查时非常有用。rc.local 的脚本执行情况很难追踪。
  4. 更快的启动速度:systemd 支持并行启动服务,因此能显著加快系统的启动速度。相比之下,rc.local 只能串行执行脚本,影响启动速度。
  5. 统一性:systemd 提供了一种统一的方式来启动、停止、重启服务以及查看服务状态,使管理更加一致和简单。rc.local 是一种较旧的方法,可能不适用于所有的服务类型。
  6. 定时任务:systemd 提供了 timer 单元来执行定时任务,而 rc.local 仅适用于开机一次性执行的任务。
  7. 更丰富的命令行选项:systemctl 命令提供了丰富的选项来管理服务和单元文件,使得操作更加灵活。
  8. 按需启动:systemd 只有在需要时才启动服务,有助于节省资源和提高系统效率。rc.local 中的脚本则是每次开机都执行,不考虑是否需要。
  9. 集成日志管理:systemd 集成了日志管理系统,使得查看服务的日志变得更加方便,而 rc.local 执行的结果可能难以记录和追踪。

综上所述,systemd 提供了更强大、更灵活的服务管理方式,相较于 rc.local,它在系统管理方面提供了更多的便利性和可靠性。


systemctl管理服务
https://xinhaojin.github.io/2024/12/11/systemctl管理服务/
作者
xinhaojin
发布于
2024年12月11日
更新于
2024年12月11日
许可协议