Linux完整dpkg服务程序

背景

一个旧版本的服务部署包存在bug————如果网管界面服务启动的阶段(监听IP/端口)挂了,只会把启动服务的那个协程干掉,而不是进行重试。

在机器重启时,docker会自动启动服务程序,然而此时系统的网络环境可能还未初始化完成,就可能导致ip绑不上,从而导致了bug被发现。

但是外场客户不愿意升级新版本,我们就想了一个trick的补丁方式:写一个开启自启程序脚本,在上电开机后3分钟运行检测网管服务是否正常启动,否则自动重启一下。

步骤

  1. 编写检测脚本;
  2. 将检测脚本打包成dpkg安装包;
  3. 安装包在安装时要完成:
    1. 依赖docker.service;
    2. 权限能够重启我们的网管服务;

编写检测脚本

我们建立一个项目目录并把这个脚本放到目录下:oam-arstart/oam-arstart.sh

1
2
3
4
5
#!/bin/bash
sleep 300

# ....doing....

dpkg打包

DEBIAN目录

DEBIAN目录下存在两个文件:controlpostinst

  • 其中control文件用来记录一些包的基本信息,如版本、作者等。

    1
    2
    3
    4
    5
    6
    Package: oam-arstart
    Version: 1.0.0
    Section: utils
    Maintainer: fq
    Architecture: amd64
    Description:
  • postinst文件则是一个脚本,用来在包安装完成后执行,所以一定要赋予可执行权限。

    1
    2
    3
    4
    5
    6
    7
    #!/bin/bash

    # 表示systemctl重新加载新的unit 配置文件
    sudo systemctl daemon-reload

    # 表示把我安装的服务设置为开机自启
    sudo systemctl enable oam-arstart.service

usr目录

usr目录下的内容,会在安装时自动copy到系统对应的目录。如oam-arstart.service文件则会把放到系统的。

  1. 服务文件:usr/lib/systemd/system/oam-arstart.service,配置了由systemd来管理的服务脚本。

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    [Unit]
    Description=auto restart 5gc script
    After=multi-user.target docker.service

    [Service]
    Type=oneshot
    WorkingDirectory=/usr/local/oam-arstart
    ExecStart=bash /usr/local/oam-arstart/oam-arstart.sh
    ExecStop=/bin/kill -s TERM $MAINPID
    RemainAfterExit=true

    [Install]
    WantedBy=multi-user.target
  2. 项目目录:usr/local/oam-arstart,我这里是直接把自己的项目目录安装到系统的/usr/local下,具体可以自己定义。

  3. 说明文档:usr/share/doc/oam-arstart,这里我直接空着的。

执行打包命令

dpkg -b oam-arstart/ oam-arstart.deb
  • Copyrights © 2019-2024 Klusfq
  • Visitors: | Views: