Linux Systemd服务管理

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脚本的依赖。有下面一些新特性(http://zh.wikipedia.org/wiki/Systemd Systemd维基百科,还有作者blog的长文 http://0pointer.de/blog/projects/systemd.html ):
采用Socket激活式与总线激活式服务,以提高相互依赖的各服务的并行运行性能;
用cgroups代替PID来追踪进程,以此即使是两次fork之后生成的守护进程也不会脱离systemd的控制。
在sysV时代,chkconfig / service 是我们经常使用的服务管理程序,在RHEL 7中这一组命令替换为systemctl来实现。fedora的文档中指出了SysVinit to Systemd Cheatsheet, 常用的有下面几点:
# 是否让服务开机运行
[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

# 启动和停止服务
[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

^^

Posted in Linux, Ops.