前言: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
-
- 将这个 .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/
目录中时,发生以下事情:
配置加载:
systemd
在启动时会扫描/etc/systemd/system/
目录以及其他目录,来查找并加载配置文件。你的自定义服务单元就是其中之一。通过将.service
文件放置在这个目录中,systemd
会自动加载和识别这个服务单元的配置。服务管理: 一旦
systemd
加载了你的服务单元配置,你可以使用systemctl
命令来管理这个服务。比如,你可以使用systemctl start 服务名
来启动服务,systemctl stop 服务名
来停止服务,systemctl restart 服务名
来重启服务,等等。自动启动: 当你在
.service
文件中设置了WantedBy
属性,将服务连接到某个目标单元时,systemd
将在系统启动时自动启动这个服务。这样,你的服务会在系统启动时自动运行。总之,将
.service
文件保存并拷贝到/etc/systemd/system/
目录中是为了让systemd
能够有效地管理、控制和运行你的自定义服务。这是一种标准的做法,确保你的服务能够与操作系统的初始化和管理机制紧密集成。
-
- 执行以下命令刷新 systemd 配置:
sudo systemctl daemon-reload
-
- 执行以下命令刷新 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
配置文件的基本名称(不包括后缀)
-
- 执行以下命令刷新 systemd 配置:
sudo systemctl status xxx
3 编写服务时使用的参数详解
在 systemd
( systemd
负责启动、停止、管理和监控系统中的各种服务,是服务之祖。)服务配置文件中,有三个主要的部分:[Unit]
、[Service]
和 [Install]
。这些部分用来定义服务的不同方面,从服务的基本属性到如何启动、运行和安装服务。以下是对每个部分的详细介绍:
-
[Unit]: 这个部分用于定义服务单元的属性,其中单元是
systemd
中的基本单位,它可以是一个服务、一个设备、一个挂载点等。在[Unit]
部分,你可以设置以下属性:-
Description
:描述你的服务的简短文本,用来说明服务的用途或功能。systemctl status
服务名时会显示改描述 -
After
:定义服务启动顺序的依赖关系,指定在哪些服务之后启动。通常设置为network.target
表示在网络服务之后启动。
-
-
[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
用于定义停止服务的命令等。
-
-
[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,
因此需要使用来启动开机自启
systemctl enable xxx
5 一些命令
- 查看所有在 systemd 中定义的服务
systemctl list-units --type=service
- 只想查看正在运行的服务
systemctl list-units --type=service --state=running
- 查看某服务的实时日志 (
journal
:日志f
:follow
追踪)
journalctl -fu 服务名
5.1 怎样才能被journalctl命令所捕获呢?
使用logging打印出的日志就可以捕获
参考文章如下:文章来源:https://www.toymoban.com/news/detail-645055.html
https://blog.csdn.net/juggte/article/details/121998755
chatgpt 3.5文章来源地址https://www.toymoban.com/news/detail-645055.html
到了这里,关于编写一个服务(python为例)的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!