systemd(systemd官网)是Linux下的一种init软件, 较好地管理多个系统服务之间的并行启动和依赖,同时达到降低系统开销的效果,最终代替现在常用的System V与BSD风格init程序。新发行的RHEL 7也用systemd来取代了sysV来管理服务。Systemd中对系统的配置有大量改变,例如在Systemd中hostname可以在/etc/hostname中设置,而非rc.conf中的HOSTNAME环境变量等。本文先简单介绍一下systemd下服务的简单配置。
与多数发行版使用的System V风格init相比,systemd借鉴了OSX中的服务管理系统launchd,减少了对Shell脚本的依赖。有下面一些新特性(Systemd维基百科,还有作者blog文章 http://0pointer.de/blog/projects/systemd.html):
(1). 采用Socket激活式与总线激活式服务,以提高相互依赖的各服务的并行运行性能;
(2). 用cgroups代替PID来追踪进程,以此即使是两次fork之后生成的守护进程也不会脱离systemd的控制。
在sys V时代,chkconfig / service 是我们经常使用的服务管理程序,在RHEL 7中这一组命令替换为systemctl来实现。fedora的文档中指出了二者的区别SysVinit to Systemd Cheatsheet。systemd中不再以runlevel来决定启动的类型,而是改成了类型(type),可以通过systemctl –type=来过滤

service:后台服务;
mount:自动挂载文件系统;
target:运行级别;
socket:用来创建套接字,并在访问套接字后,立即利用依赖关系间接地启动另一单位;

# 是否让服务开机运行
[root@localhost] systemctl disable mariadb.service 
[root@localhost] systemctl enable mariadb.service 
ln -s '/usr/lib/systemd/system/mariadb.service' '/etc/systemd/system/multi-user.target.wants/mariadb.service'

# 检查服务开机是否启动
# 启用的服务会在/etc/systemd/system/*.wants下建立符号连接,所以也可以直接检查文件:
[root@localhost] systemctl is-enabled mariadb.service     
disabled
[root@localhost] ls /etc/systemd/system/*.wants/mariadb.service
/etc/systemd/system/multi-user.target.wants/mariadb.service

# 检查当前服务的列表(功能类似之前chkconfig --list)
[root@localhost] systemctl list-unit-files --type=service
也可以使用:
[root@localhost] ls /etc/systemd/system/*.wants/

# 当新增或者修改配置文件后,可以让systemd的守护进程重新加载服务配置
[root@localhost] systemctl daemon-reload
# 或者让systemd加载一个新加入的服务配置文件
[root@localhost] systemctl load foo.service

# 启动和停止服务
[root@localhost] systemctl start mariadb.service
[root@localhost] systemctl stop mariadb.service
[root@localhost] systemctl restart mariadb.service
[root@localhost] systemctl condrestart mariadb.service    ​    ​#如果服务在运行则重启
# 重载服务的应用配置文件,需要服务的自身支持。例如iptables可以重新载入rules
[root@localhost] systemctl reload iptables.rules

# 检查服务状态
# 与service命令不同的是,systemctl status不仅提供了当前服务的进程信息,还在start, reload失败等情况发生时提供错误的日志,可以更快解决服务的故障。
[root@localhost] systemctl status mariadb.service
mariadb.service - MariaDB database server
   Loaded: loaded (/usr/lib/systemd/system/mariadb.service; enabled)
   Active: failed (Result: exit-code) since Fri 2014-08-01 15:30:01 CST; 1min 24s ago
......
Aug 01 15:30:00 localhost.localdomain mysqld_safe[8706]: /usr/bin/mysqld_safe: line 138: /var/log/mysql/mysql.log: Permi...nied

# 显示系统启动失败的服务
# systemctl --failed
UNIT             LOAD   ACTIVE SUB    DESCRIPTION
iptables.service loaded failed failed IPv4 firewall with iptables
mariadb.service  loaded failed failed MariaDB database server

yanest
193 声望13 粉丝