编写一个服务(python为例)

这篇具有很好参考价值的文章主要介绍了编写一个服务(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为例),python,开发语言
    因此需要使用来启动开机自启
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文章来源地址https://www.toymoban.com/news/detail-645055.html

到了这里,关于编写一个服务(python为例)的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • 用python编写一个小程序,如何用python编写软件

    大家好,给大家分享一下用python编写一个小程序,很多人还不知道这一点。下面详细解释一下。现在让我们来看看! 我想有人曲解意思了,人家说用python开发渣蔽一个手机app,不是说用手机敲写python代码,当然可以啊,只不过在电脑上开发的应用软件要进行打包什么的,才能

    2024年02月07日
    浏览(44)
  • python编写一个简单的游戏,python编写小游戏的代码

    大家好,本文将围绕如何用python编写一个简单的小游戏展开说明,用python做一个小游戏代码是一个很多人都想弄明白的事情,想搞清楚python编写小游戏详细教程需要先了解以下几个事情。 今天玩点别的吧都说 Python 除了生孩子什么都能干 咱们今天就用 Python 写个小游戏 贪吃蛇

    2024年02月02日
    浏览(61)
  • 快速配置 Rust 开发环境并编写一个小应用

    安装: curl --proto \\\'=https\\\' --tlsv1.2 -sSf https://sh.rustup.rs | sh 更新: Rust 的升级非常频繁. 如果安装 Rustup 后已有一段时间,那么很可能 Rust 版本已经过时, 运行 rustup update 获取最新版本的 Rust rustc:编译Rust程序 rustc只适合简单的Rust程序,较大型的项目还是推荐使用Cargo Cargo:Rust 的构建

    2024年02月16日
    浏览(50)
  • 【go语言开发】编写单元测试

    本文主要介绍使用go语言编写单元测试用例,首先介绍如何编写单元测试,然后介绍基本命令的使用,最后给出demo示例 在go语言中编写单元测试时,使用说明 测试文件命名 :在 Go 语言中,测试文件的命名应与被测试的源代码文件相同,但以 “_test” 结尾。例如,如果你的源

    2024年02月04日
    浏览(42)
  • Android开发:基于Kotlin编写一个简易计算器

    本着程序员“拥抱变化”的思想,最近开始学Kotlin了。感觉还是得通过实战来入门一门新语言,所以打算写一个基于Kotlin语言的计算器,本文对开发过程以及学习Kotlin的一些知识进行了记录。 计算器的全部源码已经放到了我的Github中,需要的伙伴自取:Calculator Kotlin中文站:

    2023年04月27日
    浏览(59)
  • 网络编程:编写一个TCP客户端与服务端

    用的系统是Ubuntu。 socket用来创建套接字。这个函数服务端与客户端都要使用。 第一个参数用来制定地址族规范,比如 AF_INET(PF_INET) 表示IPv4地址, AF_INET6(PF_INET6) 表示IPv6地址。 第二个参数用来制定套接字的类型规范,如 SOCK_STREAM 表示面向连接的套接字, SOCK_DGRAM 表示面

    2024年02月01日
    浏览(46)
  • 在Python中编写一个翻译程序

    本文使用创作助手。 要在Python中编写一个翻译程序,你可以使用 googletrans 库。以下是一个使用 googletrans 库进行翻译的简单示例: 在上述示例中,你需要将 要翻译的文本 替换为你想要翻译的文本, en 表示目标语言为英语。你可以根据需要指定不同的目标语言代码,如 fr 表

    2024年04月17日
    浏览(45)
  • 用python做一个微信小程序,用python编写一个小程序

    这篇文章主要介绍了python制作小程序制作流程,具有一定借鉴价值,需要的朋友可以参考下。希望大家阅读完这篇文章后大有收获,下面让小编带着大家一起了解一下。 大家好,小编为大家解答用python写的好玩的小程序的问题。很多人还不知道python简单的小程序,现在让我们

    2024年04月25日
    浏览(35)
  • 使用Python编写一个渗透测试探测工具

    本篇将会涉及: 资源探测 一个有用的字典资源 第一个暴力探测器 资源探测 资源探测在渗透测试中还是属于资源的映射和信息的收集阶段。 主要有以下三个类型: 字典攻击 暴力破解 模糊测试 字典攻击,在破解密码或密钥的时候,通过自定义的字典文件,有针对性地尝试字

    2024年01月16日
    浏览(41)
  • 如何利用Python编写一个用户登录窗口?

    大家好,我是室节上!今天我来教大家如何用Python编写一个用户登录窗口。 首先,我们可以想一下,一个用户登录窗口通常包含哪些东西。是不是包含有这些东西: 1.文本:  一个窗口如果没有文本,那么用户就不知道这是什么窗口。因此,这个窗口应包含有“账号”和“密

    2024年02月05日
    浏览(47)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包