[使用技巧] Linux创建自定义服务

Linux创建自定义服务

文章目录

  • Linux创建自定义服务
    • 1 需求分析
    • 2 systemctl介绍
      • 2.1 服务基本操作
      • 2.2 编写service文件
    • 3 使用案例-部署python脚本服务

1 需求分析

在实际学习/开发过程中,通常需要让某些服务做到自启,又或是停止服务,开启服务这样的操作,一种常见的作法是编写一个启动脚本,然后将该脚本放入开机自启当中。具体的来说,就是把自动启动脚本写入/etc/rc.local当中。而这么做的本质其实是利用了linux自带的自启服务,在一些高版本的linux发行版中(比如ubuntu20.04),已经删除了该服务,如果要使用必须自己进行添加。所以使用开机自启来部署自己的服务有以下几个缺点:

  • 不方便管理,结束或暂停服务需要自己编写额外的脚本
  • 需要考虑权限问题
  • 遇到异常无法自动重启
  • 配置环境变量比较麻烦
  • 部署很麻烦,通用性不强

通过使用systemctl,我们很好地部署和管理自己编写的服务,使用流程大致如下:

  1. 编写自己的服务,这里指具体的实现,例如我的服务是myService.py
  2. 编写该服务的启动脚本,例如python3 myService.py &
  3. 编写该服务的信息myService.service,这包括启动信息,环境变量,重启策略等,并放入/etc/systemd/system当中
  4. 通过指令启动服务,并设置服务开机自启

2 systemctl介绍

2.1 服务基本操作

因此,我们可以使用systemctl,它是Linux系统管理工具systemd中的一个核心组件,可以用于管理系统服务和进程。它提供了一种统一的方式来启动、停止、重启和查看系统服务的状态。它有以下几个常见的操作命令:

  • 启动一个服务:sudo systemctl start servicename.service
  • 停止一个服务:sudo systemctl stop servicename.service
  • 重启一个服务:sudo systemctl restart servicename.service
  • 重启一个服务:sudo systemctl restart servicename.service
  • 设置一个服务开机自启动:sudo systemctl enable servicename.service
  • 禁止一个服务开机自启动:sudo systemctl disable servicename.service
  • 查看所有服务的状态:sudo systemctl list-units --type=service

在使用systemctl时,需要注意以下几点:

  • 需要使用sudo或root权限来执行systemctl命令
  • 服务的名称应该以".service"结尾
  • 如果服务的状态为"failed",可以使用sudo journalctl -xe命令来查看日志以获取更多信息
  • 如果在启动服务时出现问题,可以使用sudo systemctl daemon-reload命令重新加载systemd配置文件

2.2 编写service文件

这也是使用systemctl的核心,通常一个简单的服务的.service文件也比较简单,下面是一个.service文件的例子。

[Unit]
Description=My App Service
After=network.target

[Service]
ExecStart=/usr/bin/myapp
User=myuser
Group=myuser
Restart=always
# 在3600秒内最多重启7200次
StartLimitIntervalSec=3600s
StartLimitBurst=7200


[Install]
WantedBy=multi-user.target

上述配置文件中,Description为服务的描述信息,After指定服务在哪些服务之后启动,ExecStart指定服务的启动命令,User指定服务运行的用户,Group指的是用户组,Restart指定服务遇到错误时的重启策略,WantedBy指定服务启动的级别。如果只是编写一个简单的服务,了解上述文件各个参数的意义就足够了。如果需要编写更加复杂的服务,可以看以下介绍。
下面是.service文件中所有可能出现的参数:

  1. [Unit]:服务单元的配置节,其中可以包含以下参数:
  • Description:服务的描述信息。
  • Documentation:服务文档的URL。
  • Requires:服务所依赖的其他服务。
  • Wants:服务希望但不是必须依赖的其他服务。
  • After:服务启动的顺序。
  • Before:服务停止的顺序。
  • Conflicts:与该服务冲突的其他服务。
  1. [Service]:服务的配置节,其中可以包含以下参数:
  • Type:服务的类型,包括simpleforkingoneshotdbusnotify等。
  • ExecStart:服务的启动命令。
  • ExecStop:服务的停止命令。
  • ExecReload:服务的重启命令。
  • User:服务运行的用户。
  • Group:服务运行的用户组。
  • WorkingDirectory:服务的工作目录。
  • Environment:服务的环境变量。
  • Restart:服务出错后的重启策略。
  • RestartSec:重启之前等待的时间。
  • TimeoutStartSec:启动超时时间。
  • TimeoutStopSec:停止超时时间。
  • PIDFile:服务的进程ID文件。
  • UMask:服务的文件掩码。
  • LimitNOFILE:服务能够打开的文件数的限制。
  • LimitNPROC:服务能够创建的进程数的限制。
  1. [Install]:安装服务的配置节,其中可以包含以下参数:
  • WantedBy:服务在哪些目标中启用。
  • RequiredBy:服务在哪些目标中必须启用。

以上是.service文件中可能出现的所有参数,不同的服务需要使用不同的参数进行配置。

3 使用案例-部署python脚本服务

接下来我们简单的通过一个例子来演示。假设我已经写好服务,为myService.py,启动脚本在/home/myuser/start.sh我现在编写一个.service文件如下:

[Unit]
Description=My App Service
After=network.target

[Service]
Type=forking
ExecStart=/home/myuser/start.sh
User=myuser
Group=myuser
Restart=always

[Install]
WantedBy=multi-user.target

那么对应的安装服务脚本可以写成下面这样,注意,该脚本默认当前文件夹下存在myService.service这个文件。

#!/bin/bash

SERVICE_NAME="myService.service"

sudo chmod 777 $SERVICE_NAME
sudo cp SERVICE_NAME /etc/systemd/system/$SERVICE_NAME
sudo systemctl enable $SERVICE_NAME
sudo systemctl start $SERVICE_NAME
sudo systemctl status $SERVICE_NAME

可以看到,上面的脚本本质上就是将myService.service放到了/etc/systemd/system当中,然后再通过命令打开服务,启动自启。

你可能感兴趣的:(linux,运维,服务器)