设定档格式INI + Service的管理工具Systemd简介

INI

INI, 全名是Initialization File
早期用来当设定档用的一种文件格式. 有64kb的大小限制
结构非常简单, 用``[section]当第一层,key=value```做第二层

[section name]
key_name = value_name

支持的data type只有

  • bool
  • decimal
  • hex
  • string
  • path

    至今还是不少服务用ini做设定档, 像是MySQL、systemd等等的.
    优点就好写好懂吧
    缺点就太过简单, 导致要描述复杂的结构或更多资料类型的支持时, 几乎就很麻烦, 或是做不到.

Systemd

在Linux系统下, 现在的发行版本都采用systemd做为service的管理工具,
它提供了强大的systemctl这命令工具.
但我没要深入systemd这工具, 而只是讲一下设定文件

cat /usr/lib/systemd/system/docker.service
输出其内容如下

[Unit]
Description=Docker Application Container Engine
Documentation=https://docs.docker.com
After=network-online.target firewalld.service containerd.service
Wants=network-online.target
Requires=docker.socket
Wants=containerd.service
​
[Service]
Type=notify
ExecStart=/usr/bin/dockerd -H fd:// --containerd=/run/containerd/containerd.sock
ExecReload=/bin/kill -s HUP $MAINPID
TimeoutSec=0
RestartSec=2
Restart=always
StartLimitBurst=3
StartLimitInterval=60s
LimitNOFILE=infinity
LimitNPROC=infinity
LimitCORE=infinity
TasksMax=infinity
Delegate=yes
KillMode=process
OOMScoreAdjust=-500
​
[Install]
WantedBy=multi-user.target

能清楚的看到有3个section: Unit、Service、Install
Unitsection有不少key, 就是简单用来描述这服务
像是Document就是说明该服务的文件位子
After用来说明Docker service需要在这些服务後面启动, 一样预设的分隔符号是空格;
对应的当然有Before, 就说明该服务要在哪些服务之前启动. 这样的方式来描述彼此的启动依赖顺序.

Wants则是用来描述, 服务的生命周期的依赖, 以这里为例,
表示network-online.target在Docker service启动时, 会尝试帮你先启动network-online.target,
但若是启动不起来, 或者是启动成功, 都不影响Docker serivice的启动.

Requires跟Wants就反过来了, 描述的是服务的生命周期的依赖,
以这里为例,
表示docker.socket在Docker service启动时, 会尝试帮你先启动docker.socket,
但若是启动不起来, 当前的这Unit(Docker service), 也不会被启动.
要requires对象们都成功启动, 当前的unit service才会启动.

Service这区块就主要描述怎启动这Unit, 和其他状态的命令, 以及Retry策略
太多, 再请各位看参考文件的连结

Install这区块主要就是描述, 如何安装这配置文件了
WantedBy是描述, 这服务在执行start命令後, 它的symbolic link会被放在哪个分类下
这里描述的是放在multi-user.target这target底下

这些都写好後, 可以透过systemctl来启动

systemctl start xxxx

又或者能设置成开机启动

systemctl enable xxxx


来看看systemd怎显示服务的依赖关系,
首先来看看sytemd目前运行的target

systemctl get-default 
> graphical.target

此时显示的是graphical.target而不是docker所在的multi-user.target, 但docker service还是有被启动?

此时能透过systemctl的另一个命令list-dependencies

systemctl list-dependencies graphical.target 
graphical.target
> ● ├─accounts-daemon.service
> ● ├─grub-common.service
> ● ├─systemd-update-utmp-runlevel.service
> ● └─multi-user.target
> ●   ├─cron.service
> ●   ├─docker.service

能看到multi-user.target是依赖在graphical.target底下的, 而multi-user.target有我们注册的docker.service

来看看docker.service的symbolic link是否在multi-user.target分类下

cd /etc/systemd/system/multi-user.target.wants
ls | grep 'docker'
> docker.service

参考资料

鸟哥的Linux私房菜 认识系统服务 (daemons)
Understanding Systemd Units and Unit Files


<<:  Day6 — 组合语言浅谈

>>:  【Day 17】从二开始的 Anti-Anti-Debug 生活 - Anti-Anti-Debug

Progressive Web App 架构模式: App Shell Model 概念说明 (12)

什麽是 App Shell? App Shell 乍听之下是一种技术,实际上是 Web App 架构...

[Day 26] test

写在前面 补字,晚点编辑 补字,晚点编辑 补字,晚点编辑 补字,晚点编辑 补字,晚点编辑 补字,晚点...

【第十三天 - 递回 题目分析】

先简单回顾一下,今天预计分析的题目: 题目连结:https://leetcode.com/prob...

[第七只羊] 迷雾森林舞会前夕 建立使用者关联

天亮了 昨晚是平安夜 关於迷雾森林故事 秘密通道 Rocky 循着发光的脚印继续寻找爸爸妈妈的下落 ...

Day 8 | 比较漂亮的清单-客制化Adapter

Adapter客制化 当需要图文并茂时,就需要客制化Adapter。 建立资料 data class...