systemd的简明介绍及日常使用

从设计构思上说,由于systemd使用了cgroup与fanotify等组件以实现其特性,所以只适用于Linux。有鉴于此,考虑到kFreeBSD分支的软件源无法纳入systemd,为与其他分支保持一致,Debian开发者尽力避免纳入systemd。但Lennart Poettering本人对此并不在意,并称“Debian GNU/kFreeBSD不过是玩具系统”。但Debain 8.0 Jessie开始以systemd取代sysvinit。

quote from Wikipedia

维基百科上的这段小故事真的是很有意思,

人类社会的就是由一小撮螳臂挡车的

不对,不对,窜台了

人类社会的就是由一小撮天才不断的单点突破,扛起旗帜,带领人类前行的。在IT领域,特别是软件领域,尤其如此。salute to Lennart Poettering.

systemd是一个用于Linux操作系统的系统和服务管理器。systemd的unit概念提供了一种统一的方式来管理和配置系统资源。unit的类型种类其实不少,有将近10种。本文只讲一下Service和Target,其他的平常用的比较少。

Service

Service Units(服务单元):用于定义和管理系统服务。

[Unit]
Description=My Service
After=network.target

[Service]
Type=simple
ExecStart=/path/to/my-service-command
User=myuser
Group=mygroup
WorkingDirectory=/path/to/working/directory
Environment="VAR1=example" "VAR2=123"
ExecStartPre=/path/to/pre-start-script
ExecStartPost=/path/to/post-start-script
ExecStop=/path/to/stop-script
Restart=on-failure
RestartSec=5s

[Install]
WantedBy=default.target

配置解释:

[Unit]:

Description:描述服务的文本信息。
After:指定服务应该在哪些其他单元(例如 network.target)之后启动。
[Service]:

Type:指定服务的类型,常见的类型包括 simple、forking、oneshot 和 notify。
ExecStart:指定要启动的服务命令或脚本的路径。
User 和 Group:指定运行服务的用户和用户组。
WorkingDirectory:指定服务的工作目录。
Environment:定义服务的环境变量,以空格分隔多个键值对。
ExecStartPre 和 ExecStartPost:定义在启动服务之前和之后要执行的脚本或命令。
ExecStop:指定停止服务时要执行的脚本或命令。
Restart 和 RestartSec:定义服务在遇到错误或意外终止时的重启行为,以及重启之间的等待时间间隔。
[Install]:

WantedBy:指定服务在哪个目标单元(例如 default.target)之下启动。

在实际配置中,还可以使用其他配置选项,如 ExecReload(定义重载配置时要执行的命令)和 LimitNPROC(限制服务的进程数)等。完成配置后,将其保存为 your-service-name.service,并将其放置在 /etc/systemd/system/ 目录下。

systemctl常用命令

systemctl start service_name

systemctl stop service_name

systemctl restart service_name

systemctl status service_name

systemctl enable service_name

systemctl disable service_name

查看所有已启动的服务列表:systemctl list-units --type service

查看所有的服务:systemctl list-units --type service --all

查看开机自启的服务情况:systemctl list-unit-files --type service

Target

Target Units:用于模拟实现运行级别(runlevel),0-6级。

init 0   # 切换到运行级别 0(关机)
init 1   # 切换到运行级别 1(单用户模式)
init 2   # 切换到运行级别 2(多用户模式,无网络支持)
init 3   # 切换到运行级别 3(多用户文本模式)
init 4   # 切换到运行级别 4(保留)
init 5   # 切换到运行级别 5(多用户图形模式)
init 6   # 切换到运行级别 6(系统重启)

在systemd中发生了转化:
0:runlevel0.target,poweroff.target
1:runlevel1.target,rescue.target
2-4:runlevel2-4.target,multi-user.target
5:runlevel5.target,graphical.target
6:runlevel6.target,reboot.target

如何使用systemctl操作?

级别切换:
init N >> systemctl isolate name.target
查看目前级别:
runlevel >> systemctl list-units --type=target --state=active
获取默认运行级别:
/etc/inittab >> systemctl get-default
修改默认级别:
/etc/inittab >> systemctl set-default name.target