systemd是什么

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

为什么要使用systemd

  1. service文件编写简单易用
  2. 可以自动维持进程存活(强大的功能,可以取代PM2)
  3. 自动收集进程输出的输出

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" ]; thenecho "Error! $PROG is running!" 2>&1exit 1else$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" ]; thenpid=`ps ax|grep testd|awk '{print $2}'|head -n 1`kill $pidrm -rf "$PID_PATH/$PROG.pid"echo "$PROG $pid killed"elseecho "Error! $PROG not running!" 2>&1exit 1fi
}if [ "$(id -u)" != "0" ]; thenecho "Please run as root!" 2>&1exit 1
ficase "$1" instart)startexit 0;;stop)stopexit 0;;reload|restart)stopstartexit 0;;**)echo "Usage: $0 {start|stop|reload}" 2>&1exit 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来处理。

使用systemd来构建你的服务相关推荐

  1. as 不显示gradle视图_Python构建RESTful网络服务[Django篇:基于类视图的API]

    系列文章介绍 本系列文章将详细介绍将Django官方引导教程中的投票项目改写为RESTful网络服务.Django官方教程地址https://docs.djangoproject.com/zh-han ...

  2. 在Red Hat Linux5下构建LAMP网站服务平台之MySQL、PHP的安装与配置

    在Red Hat Linux5下构建LAMP网站服务平台之MySQL.PHP的安装与配置 2010-09-09 16:40:49 标签:PHP Linux mysql RedHat [推送到技术圈] ...

  3. flask url构建_如何为生产构建构建Flask-RESTPlus Web服务

    flask url构建 by Greg Obinna 由格雷格·奥比纳(Greg Obinna) 如何为生产构建构建Flask-RESTPlus Web服务 (How to structure a F ...

  4. dubbo k8s 服务发现_工商银行基于 Dubbo 构建金融微服务架构的实践-服务发现篇

    作者 | 张远征来源|阿里巴巴云原生公众号 导读:Dubbo 作为分布式微服务框架,众多公司在实践中基于 Dubbo 进行分布式系统架构.重启开源后,我们不仅看到 Dubbo 3.0 最新的 Road ...

  5. 构建 RESTful Web 服务

    from: https://www.ibm.com/developerworks/cn/education/java/j-rest/j-rest.html 开始之前 关于本教程 REST 是一种思维方 ...

  6. 数据分析:构建可视化报表服务

    上一步>>数据处理:数据建模与加工 实验背景介绍 本手册为北京云栖 Workshop<云数据·大计算:快速搭建互联网在线运营分析平台>的<数据分析:构建可视化报表服务&g ...

  7. Netty实战 IM即时通讯系统(十二)构建客户端与服务端pipeline

    Netty实战 IM即时通讯系统(十二)构建客户端与服务端pipeline 零. 目录 IM系统简介 Netty 简介 Netty 环境配置 服务端启动流程 客户端启动流程 实战: 客户端和服务端双向 ...

  8. 使用 Jersey 和 Apache Tomcat 构建 RESTful Web 服务

    http://www.ibm.com/developerworks/cn/web/wa-aj-tomcat/ 使用 Jersey 和 Apache Tomcat 构建 RESTful Web 服务 Y ...

  9. 基于 Spring Security OAuth2和 JWT 构建保护微服务系统

    我们希望自己的微服务能够在用户登录之后才可以访问,而单独给每个微服务单独做用户权限模块就显得很弱了,从复用角度来说是需要重构的,从功能角度来说,也是欠缺的.尤其是前后端完全分离之后,我们的用户信息不一 ...

  10. 深度学习表征的不合理有效性——从头开始构建图像搜索服务(二)

    摘要:还在为搜索引擎的工作原理感到困惑吗?看完本篇就可以自己动手构建搜图服务了. 接着上篇<深度学习表征的不合理有效性--从头开始构建图像搜索服务(一)>的内容,上次遇到的问题是搜索相似图 ...

最新文章

  1. 解决逆向工程mapper映射文件不发布问题
  2. 启明云端分享| 2.4寸磁编码旋钮屏
  3. 20175213 2018-2019-2 《Java程序设计》第4周学习总结
  4. selenium之HTMLTestRunner练习
  5. python函数type的用意_python中type()是什么意思
  6. ASP.NET 4中的SEO改进
  7. flash player for linux 64,64-bit linux下装什么adobe flash player
  8. Python:Python3错误提示TypeError: slice indices must be integers or None or have an __index__ method解决办法
  9. HttpReponse
  10. 制作嵌入式文件系统工具 mkfs.ext2 mkfs.ext3 mkfs.ext4
  11. 计算机三年级到六年级知识点,小学三年级至六年级信息技术教学总结
  12. 云终端计算机进入bios,【惠普进bios按什么键】惠普进bios调u盘启动_惠普进入bios-系统城...
  13. 微信小程序-文字跑马灯
  14. SQL Server 2005“备份集中的数据库备份与现有的数据库不同”解决方法 详细出处参考:http://www.jb51.net/article/19233.htm
  15. Spring Boot使用jasypt处理加密问题
  16. IDEA与VsCode两种开发工具的比较
  17. Win32 API 函数列表1(格式有点乱)
  18. Dreamweaver CC 2017中文版
  19. 都匀三中2021高考成绩查询,2017年黔南州高考各县市600分以上人数统计表,都匀市仅排第九。...
  20. 【web3.0设计】区块链如何解决真实交易的信用问题?

热门文章

  1. subsequence java_Java StringBuilder subSequence()方法与示例
  2. qmap按插入顺序排序_C++语言排序算法之插入排序
  3. jvm调优工具_高级程序员必会的5个JVM性能监控、调优工具使用详解
  4. 监听程序当前无法识别连接描述符中请求的服务_Linux I/O复用中select poll epoll模型的介绍及其优缺点的比较...
  5. 无监督学习 k-means_无监督学习-第5部分
  6. mysql 组复制详解_MySQL 5.7: 使用组复制(MySQL Group Replication)
  7. php 标点符号,php怎么去除标点符号
  8. 如何去除PDF的水印
  9. Exp5 MSF基础应用
  10. Runtime 源码阅读