编写一个服务(python为例)

前言:python程序采用nobup xxx &方式在服务器后台运行程序,但没用过十几天后就会报错,需要手动重启程序,因此想着有没有可以自动重启程序方式,进而了解到了服务。
  • 目前就是采取的

1 什么是服务

首先服务也是一种程序,但它是一种比较特殊的程序:服务是在系统后台运行、并等待用户或其它软件调用的一类特殊程序。
我们通过执行命令所打开的进程大都属于是交互式进程,如果不采用nohup进行处理,那么这些进程基本上都是与终端相关,只要将进程所在的终端关闭,那么这些进程也就自动终止了。但是服务则不同,我们无论在哪个终端上运行了一个服务,这个服务所产生的进程都与终端无关,也就是说,将终端关闭之后,这些服务进程仍然会在系统后台自动运行。
一般以d结尾d是英文单词daemon的缩写,表示这是一种守护进程。

2.如何编写服务并启用一个服务

  • 模板如下 命名为xxx.service
[Unit]
Description=Your Python Program
After=network.target

[Service]
ExecStart=/usr/local/bin/python3 /python_pro/consum.py
WorkingDirectory=/python_pro
Restart=always
User=<username>

[Install]
WantedBy=multi-user.target
    1. 将这个 .service 文件保存并拷贝到 /etc/systemd/system/ 目录中
sudo cp my_program.service /etc/systemd/system/

.service 文件保存并拷贝到 /etc/systemd/system/ 目录中是为了让 systemd
能够管理和运行你的自定义服务。这个过程涉及到 systemd 的配置和管理机制。

systemd 是现代 Linux 系统的初始化系统,它负责管理系统的各种服务、进程和资源。自定义服务单元(如 .service
文件)是用来告诉 systemd 如何管理你的应用程序或服务的指令集。当你将 .service 文件放置在
/etc/systemd/system/ 目录中时,发生以下事情:

  1. 配置加载: systemd 在启动时会扫描 /etc/systemd/system/ 目录以及其他目录,来查找并加载配置文件。你的自定义服务单元就是其中之一。通过将 .service
    文件放置在这个目录中,systemd 会自动加载和识别这个服务单元的配置。

  2. 服务管理: 一旦 systemd 加载了你的服务单元配置,你可以使用 systemctl 命令来管理这个服务。比如,你可以使用 systemctl start 服务名 来启动服务,systemctl stop 服务名
    来停止服务,systemctl restart 服务名 来重启服务,等等。

  3. 自动启动: 当你在 .service 文件中设置了 WantedBy 属性,将服务连接到某个目标单元时,systemd 将在系统启动时自动启动这个服务。这样,你的服务会在系统启动时自动运行。

总之,将 .service 文件保存并拷贝到 /etc/systemd/system/ 目录中是为了让 systemd
能够有效地管理、控制和运行你的自定义服务。这是一种标准的做法,确保你的服务能够与操作系统的初始化和管理机制紧密集成。

    1. 执行以下命令刷新 systemd 配置:
sudo systemctl daemon-reload
    1. 执行以下命令刷新 systemd 配置:
sudo systemctl start xxx

systemctl 命令中,你应该使用 .service 配置文件的基本名称作为服务名,而不包括 .service
后缀。所以,对于名为 my_program.service 的配置文件,服务名应该是 my_program,而不是
my_program.service

例如,假设你有一个 .service 配置文件叫做 my_program.service,它定义了一个名为 my_program
的服务。那么,你应该这样使用 systemctl 命令来管理这个服务:

  • 启动服务:sudo systemctl start my_program
  • 停止服务:sudo systemctl stop my_program
  • 重启服务:sudo systemctl restart my_program
  • 查看服务状态:sudo systemctl status my_program
  • 启用服务(在系统启动时自动启动):sudo systemctl enable my_program
  • 禁用服务(在系统启动时不自动启动):sudo systemctl disable my_program

记住,这里的服务名是 .service 配置文件的基本名称(不包括后缀)

    1. 执行以下命令刷新 systemd 配置:
sudo systemctl status xxx

3 编写服务时使用的参数详解

systemd ( systemd 负责启动、停止、管理和监控系统中的各种服务,是服务之祖。)服务配置文件中,有三个主要的部分:[Unit][Service][Install]。这些部分用来定义服务的不同方面,从服务的基本属性到如何启动、运行和安装服务。以下是对每个部分的详细介绍:

  1. [Unit]: 这个部分用于定义服务单元的属性,其中单元是 systemd 中的基本单位,它可以是一个服务、一个设备、一个挂载点等。在 [Unit] 部分,你可以设置以下属性:

    • Description:描述你的服务的简短文本,用来说明服务的用途或功能。

      systemctl status 服务名时会显示改描述

    • After:定义服务启动顺序的依赖关系,指定在哪些服务之后启动。通常设置为 network.target 表示在网络服务之后启动。

  2. [Service]: 这个部分用于定义服务的执行方式、行为和环境。在 [Service] 部分,你可以设置以下属性:

    • ExecStart:定义启动服务的命令。这通常是你要执行的主要命令,可以包括执行你的 Python 程序的命令。ExecStart=/usr/local/bin/python3 /python_pro/consum.py/usr/local/bin/python3时python解释器的绝对路径, /python_pro/consum.py是程序的绝对路径。
    • WorkingDirectory:指定服务的工作目录,即命令执行的起始路径。WorkingDirectory=/python_pro他会先切换到 cd /python_pro下再执行ExecStart中的命令。
    • Restart:定义在服务停止后如何重启,常用的选项有 always(总是重启)、on-failure(在失败时重启)等。一般使用always,表示服务无论在何种情况下退出,都会被自动重启,如正常关机、重启、断电后重新启动系统、服务进程崩溃还是异常退出等。
    • User:指定服务运行的用户。一般是root
    • 其他属性:还可以设置其他属性,如 Environment 用于设置环境变量(如数据库信息,我现在用的是明文在代码中,其实更安全的是写在环境变量中,避免上传到github上泄露信息。)、ExecStop 用于定义停止服务的命令等。
  3. [Install]: 这个部分用于定义服务的安装和启动级别。在 [Install] 部分,你可以设置以下属性:

    • WantedBy:指定服务被哪些 systemd target(如 multi-user.target)所需要。这会影响服务在启动时的自动开启。multi-user.target 下启动,即它会在多用户命令行环境中启动。这意味着当系统启动到多用户模式时,该服务会自动启动。如果你希望在图形界面环境中自动启动,可以将 WantedBy 设置为 graphical.target。
    • Alias:设置一个可选的服务别名,如果有其他服务需要引用这个服务,可以用别名代替。

这三个部分一起定义了一个完整的 systemd 服务配置。你可以在这些部分中设置各种属性,以满足你的需求,确保你的服务在启动、运行和停止时都能按预期进行。

在编写 .service 文件时,你需要注意每个部分的语法和属性设置,确保它们能够正确地描述和控制你的服务。

4 几个注意点

  • 将`xxx .service` 文件保存并拷贝到 /etc/systemd/system/ 目录是为了 `systemd` 加载了你的服务单元配置,你可以使用 `systemctl` 命令来管理这个服务。
    
  • 假设你有一个 `.service` 配置文件叫做 `my_program.service`,它定义了一个名为 `my_program` 的服务。那么,你应该这样使用 `systemctl` 命令来管理这个服务:启动服务:`sudo systemctl start my_program`,不应该包含后缀`.service`
    
  • 当你在 .service 配置文件中设置了 Restart=always 时,systemd 会自动尝试在服务退出时自动重启它,而不需要手动运行 sudo systemctl enable 服务名。
    
  • 勘误 写了Restart=always仍是disable,
    编写一个服务(python为例)_第1张图片
    因此需要使用来启动开机自启
systemctl enable xxx

5 一些命令

  • 查看所有在 systemd 中定义的服务
systemctl list-units --type=service
  • 只想查看正在运行的服务
systemctl list-units --type=service --state=running
  • 查看某服务的实时日志 (journal:日志 ffollow追踪)
journalctl -fu 服务名

5.1 怎样才能被journalctl命令所捕获呢?

使用logging打印出的日志就可以捕获

参考文章如下:

https://blog.csdn.net/juggte/article/details/121998755
chatgpt 3.5

你可能感兴趣的:(python,开发语言)