趁热打铁看了些RH中systemd的知识,简单记录总结如下
需求分析
结合之前定位的mariadb启动失败,简单分析下对systemd的需求
- 怎么管理service
- 怎么添加/修改/删除service
- 基本的概念&结构,包括配置
大概如上面四点吧,下面记录下在看幸福同学的ppt+RH的官网文档时,一些心得吧。
RH文档
地址戳左边:chap-Managing_Services_with_systemd
文章很长很详细,记录些关键地方,方便查询
config的位置
- /usr/lib/systemd/system/
- rpm installed
- /run/systemd/system/
- runtime
- /etc/systemd/system/
- systemctl enable
优先顺序是:etc 》 run 》 usr
main features
- 并发性依赖于.socket
- 另外支持的启动方式:device,D-Bus,Path
- Transactional unit activation logic
- 会计算service之间的dependencies,如果出现cycle,会remove non-essential jobs
常见的管理cmd
除了start stop啥的,比较有用的
systemctl list-units --type service
systemctl list-units --type service --all
用他的目的是能按照类型去查询unit,并看对应的状态。俩命令的区别是unit是否active。
systemctl list-unit-files
这个呢列出的是所有的unit,不管是enable还是disable。这个命令下,output中的STATE有三个值,分别是:
- disable
- enable
- static
- 不能通过systemctl enable/disable来管理,但是可以被别的服务拉起,通过配置wants&requires
而在systemctl中有针对enable&active的单个查询,如下:
systemctl is-enable xxx
systemctl is-active xxx
一个unit从install==》enable,才会可用;然后通过active来标记了当前服务的runtime状态
另一个比较好使的就是dependency的查看咯
systemctl list-dependencies --before/after
用mariadb举个简单例子:
systemctl list-d
mariadb.service
● ├─-.mount
● ├─system.slice
● ├─systemd-journald.socket
● ├─basic.target
● ├ 省略了basic.target下属的unit
● ├─network.target
● │ ├─firewalld.service
● │ ├─netcf-transaction.service
● │ ├─network.service
● │ └─network-pre.target
● └─syslog.target
为啥呢?看下mariadb.service
[Unit]
Description=MariaDB database server
After=syslog.target
After=network.target
[Service]
Type=simple
User=mysql
Group=mysql
ExecStartPre=/usr/libexec/mariadb-prepare-db-dir %n
# Note: we set --basedir to prevent probes that might trigger SELinux alarms,
# per bug #547485
ExecStart=/usr/bin/mysqld_safe --basedir=/usr
ExecStartPost=/usr/libexec/mariadb-wait-ready $MAINPID
# Give a reasonable amount of time for the server to start up/shut down
TimeoutSec=300
# Place temp files in a secure directory, not /tmp
PrivateTmp=true
[Install]
WantedBy=multi-user.target
so起作用的有三个配置:
WantedBy=multi-user.target
After=syslog.target
After=network.target
写一个service文件
具体配置的话,man systemctl最全面,官网文档只是一部分哟
requires&wants跟after&before的区别
区别就是在是否拉起来对应的服务。顾名思义,after是在对应service之前运行的意思。但是:
Unlike Requires, After does not explicitly activate the specified units.
而requires和wants的区别是,所需service启动失败后,是否继续启动当前service。requires是不启动,而wants会尝试启动。
改动service文件后
一定要重启:systemctl daemon-reload
,然后在start/reload
对应的服务
参考文档列表
- systemd管理说明
- RedHat7 doc
- systemd的启动说明
- 这个文章很赞啊,里面有个systemd的启动顺序图