资讯专栏INFORMATION COLUMN

使用systemd来构建你的服务

rockswang / 2655人阅读

摘要:简单说,用于后台以守护精灵的形式运行程序。启动服务停止服务重启服务将设置为开机启动编写文件一般放在文件夹中。文件是结构化的,以下给出一份笔者常用的清单。该服务运行完毕后没有进程,所以需要配合。

systemd是什么

Systemd 服务是一种以 .service 结尾的单元(unit)配置文件,用于控制由Systemd 控制或监视的进程。简单说,用于后台以守护精灵(daemon)的形式运行程序。

为什么要使用systemd

service文件编写简单易用

可以自动维持进程存活(强大的功能,可以取代PM2)

自动收集进程输出的输出

systemd主要命令

可以看到systemd以字母d结尾,根据linux惯用规则,可以判断该进程为守护进程,可以通过systemctl与之交互。

systemctl start redis.service #启动服务
systemctl stop redis.service #停止服务
systemctl restart redis.service #重启服务
systemctl enable redis.service #将redis设置为开机启动
编写systemd

systmd service文件一般放在/etc/systemd/system/文件夹中。

systemd service文件是结构化的,以下给出一份笔者常用的清单。

[Unit]
Description=Git Auto Update Hook Service
After=network.target

[Service]
Type=simple
ExecStart=/root/src/git-hookd/git-hookd
Restart=always
[Install]
WantedBy=multi-user.target

拿之前写过的init.d的脚本对比一下

#!/bin/bash
### BEGIN INIT INFO
# Provides:          xialeistudio
# Required-Start:    $network
# Required-Stop:     $local_fs
# Default-Start:     2 3 4 5
# Default-Stop:      0 1 6
# Short-Description: test service
# Description:       test service
### END INIT INFO
PROG="testd"
PROG_PATH="/root/apps/testd"
PROG_ARGS="-u xialei"
PID_PATH="/var/run/"

start() {
        if [ -e "$PID_PATH/$PROG.pid" ]; then
                echo "Error! $PROG is running!" 2>&1
                exit 1
        else
                $PROG_PATH/$PROG $PROG_ARGS 2>&1 > "/var/log/$PROG.log" &
                pid=`ps ax|grep testd|awk "{print $2}"|head -n 1`
                echo "$PROG started"
                echo $pid > "$PID_PATH/$PROG.pid"
        fi      
}

stop() {
        if [ -e "$PID_PATH/$PROG.pid" ]; then
                pid=`ps ax|grep testd|awk "{print $2}"|head -n 1`
                kill $pid
        
                rm -rf "$PID_PATH/$PROG.pid"
                echo "$PROG $pid killed"
        else
                echo "Error! $PROG not running!" 2>&1
                exit 1
        fi
}

if [ "$(id -u)" != "0" ]; then
        echo "Please run as root!" 2>&1
        exit 1
fi

case "$1" in
    start)
                start
                exit 0
        ;;
        stop)
                stop
                exit 0
        ;;
        reload|restart)
                stop
                start
                exit 0
        ;;
        **)
                echo "Usage: $0 {start|stop|reload}" 2>&1
                exit 1
        ;;
esac

可以看到init.d脚本实在是太原始了,systemd取代init.d指日可待

systemd service文件说明

service文件由 Unit, Service, Install 三部分组成

Unit

所有引导过程中systemd要控制的文件/设备/程序等等都称为一个单元。

Description: 服务描述

Wants: 本单元启动成功,则会启动此字段定义的单元,如果Wants定义的单元启动失败,对本单元无影响

Requires:本单元启动成功,则会启动此字段定义的单元,如果Requires定义的单元启动失败,本单元也失败。该字段无法控制先后顺序,如果Requires定义的单元未启动完成就启动本单元,那么一个都启动不了,不建议用这个字段

OnFailure: 本单元如果启动失败,则启动该字段定义的单元

Before/After:指定本单元的启动顺序

本例中只需要依赖网络单元即可

Service

服务本体定义:

Type 启动类型

ExecStart 启动服务的命令

ExecStop 停止服务的命令(一般不写)

Restart 重启规则

RemainAfterExit 即使没有进程,也认为服务启动成功

Type 启动类型有以下几种:

+ simple: 默认类型,启动的进程将成为服务进程。
+ forking:标准Unix Daemon进程。本进程启动后会通过系统调用fork,把必要的通信频道都设置好之后父进程退出,留下守护精灵的子进程。(也就是说你自己来将进程变成daemon进程)
+ oneshot:一次性命令。该服务运行完毕后没有进程,所以需要配合RemainAfterExit。

Restart 重启规则有以下几种:

+ no(默认值):退出后不会重启
+ always:不管是什么退出原因,总是重启
+ on-success:只有正常退出时(退出状态码为0),才会重启
+ on-failure:非正常退出时(退出状态码非0),包括被信号终止和超时,才会重启
+ on-abnormal:只有被信号终止和超时,才会重启
+ on-abort:只有在收到没有捕捉到的信号终止时,才会重启
+ on-watchdog:超时退出,才会重启
Install

systemd装载规则定义

WantedBy 将被谁装载,本例中使用multi-user.target,最终服务将通过软链接到/etc/systemd/system/multi-user.target.wants目录

Alias 服务别名,可以通过 systemctl 服务别名 restart 之类的来操作

写在最后

是时候通过systemd改写init.d的服务了,有必要的话可以连pm2守护的进程都交给systemd来处理。

文章版权归作者所有,未经允许请勿转载,若此文章存在违规行为,您可以联系管理员删除。

转载请注明本文地址:https://www.ucloud.cn/yun/63440.html

相关文章

  • 三年后,我们从 Docker 转到了 RKT

    摘要:在被纳入后,与之争日趋白热化。一如微软曾经试图通过在中安装来排挤,现在正在尝试将融入到,以此来打击,,和。如同微软确确实实提升了的性能。浏览器突出了微软的优势,所以他们在年内都没有继续开发了。 在 Swarm 被纳入 Docker 1.12后,Swarm 与 K8S 之争日趋白热化。本文作者 Adriaan de Jonge 身为 Xebia CTO ,专精 DevOps 及持续交付,...

    Achilles 评论0 收藏0
  • 在国内 docker build 的正确姿势

    摘要:由于某些原因,在国内构建第三方镜像是一件考验耐心的事情。国内有不少的镜像源,比如中科大阿里云。以中科大的镜像源为例,可以这样指定镜像源通常作为一个服务由系统在开机时启动,所以我们需要把上面的指令加到服务的配置中。 由于某些原因,在国内构建第三方docker镜像是一件考验耐心的事情。在神奇的国度生活,自然也要用神奇的生活方式。跟解决其他同类问题一样,解决这个问题常用两种方法,一曰换源,二...

    frolc 评论0 收藏0
  • 14个Linux系统安全小妙招,总有一招用的上!

    摘要:大多数使用者都会认为默认是安全的,有时候这种说法也的确是一个存在争议的话题。对于系统管理员,让产品的系统更安全,免于骇客和黑客的攻击,一直是一项挑战。保证系统包含了最新版本的补丁安全修复和可用内核。 对于互联网IT从业人员来说,越来越多的工作会逐渐转移到Linux系统之上,这一点,无论是开发、运维、测试都应该是深有体会。曾有技术调查网站W3Techs于2018年11月就发布一个调查报告...

    joy968 评论0 收藏0
  • Elasticsearch 参考指南(重要的系统配置)

    摘要:使用的系统在配置中将设置为。文件描述符这只适用于和,如果在上运行,则可以被安全地忽略,在上,使用的仅限于可用资源。和软件包默认文件描述符的最大数量为,不需要进一步配置。当作为服务在下运行时,包发行版将为进程自动配置线程数,不需要额外的配置。 重要的系统配置 理想情况下,Elasticsearch应该在服务器上单独运行,并使用所有可用的资源,为了做到这一点,你需要配置你的操作系统,以允许...

    TANKING 评论0 收藏0
  • 如何编写一个Systemd Service

    摘要:编写服务的内容主要分为三个部分,控制单元的定义服务的定义以及安装部分。基本的用法如下代表整个单元的描述,可根据需要任意填写。标准使用的启动方式。同时只有这种类型支持多条命令,命令之间用分割,如需换行可以用。 0x01 什么是Systemd Service Systemd 服务是一种以 .service 结尾的单元(unit)配置文件,用于控制由Systemd 控制或监视的进程。简单说...

    vibiu 评论0 收藏0

发表评论

0条评论

最新活动
阅读需要支付1元查看
<