Systemd

Systemd

init进程Linux系统Booting之后的首个进程,其作为守护进程运行直至系统关闭;传统的Linux中的服务控制方式也主要依赖于sysvinit机制:

$ sudo /etc/init.d/apache2 start
# 或者
$ service apache2 start

sysvinit系统初始化的时候,它是串行启动,并且会将所有可能用到的后台服务进程全部启动运行;系统必须等待所有的服务都启动就绪之后,才允许用户登录,导致启动时间过长与系统资源浪费。并且init进程只是执行启动脚本,不管其他事情,脚本需要自己处理各种情况,使得脚本复杂度增加很多。Systemd就是为了解决这些问题而诞生的。它的设计目标是,为系统的启动和管理提供一套完整的解决方案;Systemd并不是一个命令,而是一组命令,涉及到系统管理的方方面面。

# 查看 Systemd 的版本
$ systemctl --version

# 重启系统
$ sudo systemctl reboot

# 关闭系统,切断电源
$ sudo systemctl poweroff

# CPU 停止工作
$ sudo systemctl halt

# 查看启动耗时
$ systemd-analyze

# 查看每个服务的启动耗时
$ systemd-analyze blame

# 显示瀑布状的启动过程流
$ systemd-analyze critical-chain

# 显示指定服务的启动流
$ systemd-analyze critical-chain atd.service

Systemd可以管理所有系统资源。不同的资源统称为Unit(单位)Unit一共分成12种。

  • Service unit:系统服务
  • Target unit:多个Unit构成的一个组
  • Device Unit:硬件设备
  • Mount Unit:文件系统的挂载点
  • Automount Unit:自动挂载点
  • Path Unit:文件或路径
  • Scope Unit:不是由Systemd启动的外部进程
  • Slice Unit:进程组
  • Snapshot Unit:Systemd快照,可以切回某个快照
  • Socket Unit:进程间通信的socket
  • Swap Unit:swap文件
  • Timer Unit:定时器

systemctl status命令用于查看系统状态和单个Unit的状态。

# 显示系统状态
$ systemctl status

# 显示单个 Unit 的状态
$ sysystemctl status bluetooth.service

# 显示远程主机的某个 Unit 的状态
$ systemctl -H root@rhel7.example.com status httpd.service

我们最常用的就是Unit管理命令:

# 立即启动一个服务
$ sudo systemctl start apache.service

# 立即停止一个服务
$ sudo systemctl stop apache.service

# 重启一个服务
$ sudo systemctl restart apache.service

# 杀死一个服务的所有子进程
$ sudo systemctl kill apache.service

# 重新加载一个服务的配置文件
$ sudo systemctl reload apache.service

# 重载所有修改过的配置文件
$ sudo systemctl daemon-reload

# 显示某个 Unit 的所有底层参数
$ systemctl show httpd.service

# 显示某个 Unit 的指定属性的值
$ systemctl show -p CPUShares httpd.service

# 设置某个 Unit 的指定属性
$ sudo systemctl set-property httpd.service CPUShares=500

每一个Unit都有一个配置文件,告诉Systemd怎么启动这个UnitSystemd默认从目录 /etc/systemd/system/ 读取配置文件。但是,里面存放的大部分文件都是符号链接,指向目录 /usr/lib/systemd/system/,真正的配置文件存放在那个目录。systemctl enable命令用于在上面两个目录之间,建立符号链接关系。配置文件的基础格式如下:

[Unit]
Description=ATD daemon

[Service]
Type=forking
ExecStart=/usr/bin/atd

[Install]
WantedBy=multi-user.target

centos 7以上是用Systemd进行系统初始化的,SystemdLinux系统中最新的初始化系统(init),它主要的设计目标是克服sysvinit固有的缺点,提高系统的启动速度。关于Systemd的详情介绍在这里

Systemd服务文件以.service结尾,比如现在要建立nginx为开机启动,如果用yum install命令安装的,yum命令会自动创建nginx.service文件,直接用命令

1 systemcel enable nginx.service

设置开机启动即可。

设置开机启动即可。在这里我是用源码编译安装的,所以要手动创建nginx.service服务文件。

设置开机启动即可。在这里我是用源码编译安装的,所以要手动创建nginx.service服务文件。开机没有登陆情况下就能运行的程序,存在系统服务(system)里,即:

1 /lib/systemd/system/

1.在系统服务目录里创建nginx.service文件

1 vim /lib/systemd/system/nginx.service

内容如下

12345678910111213 [Unit] Description=nginx After=network.target [Service] Type=forking ExecStart=/usr/local/nginx/sbin/nginx ExecReload=/usr/local/nginx/sbin/nginx -s reload ExecStop=/usr/local/nginx/sbin/nginx -s quitPrivateTmp=true [Install] WantedBy=multi-user.target

[]: Unit “服务的说明” []: Unit “服务的说明”

Description:描述服务

[]: Unit “服务的说明”

Description:描述服务 After:描述服务类别

[]: Unit “服务的说明”

Description:描述服务 After:描述服务类别 [Service]服务运行参数的设置

[]: Unit “服务的说明”

Description:描述服务 After:描述服务类别 [Service]服务运行参数的设置 Type=forking是后台运行的形式

[]: Unit “服务的说明”

Description:描述服务 After:描述服务类别 [Service]服务运行参数的设置 Type=forking是后台运行的形式 ExecStart为服务的具体运行命令

[]: Unit “服务的说明”

Description:描述服务 After:描述服务类别 [Service]服务运行参数的设置 Type=forking是后台运行的形式 ExecStart为服务的具体运行命令 ExecReload为重启命令

[]: Unit “服务的说明”

Description:描述服务 After:描述服务类别 [Service]服务运行参数的设置 Type=forking是后台运行的形式 ExecStart为服务的具体运行命令 ExecReload为重启命令 ExecStop为停止命令

[]: Unit “服务的说明”

Description:描述服务 After:描述服务类别 [Service]服务运行参数的设置 Type=forking是后台运行的形式 ExecStart为服务的具体运行命令 ExecReload为重启命令 ExecStop为停止命令 PrivateTmp=True表示给服务分配独立的临时空间

[]: Unit “服务的说明”

Description:描述服务 After:描述服务类别 [Service]服务运行参数的设置 Type=forking是后台运行的形式 ExecStart为服务的具体运行命令 ExecReload为重启命令 ExecStop为停止命令 PrivateTmp=True表示给服务分配独立的临时空间注意:[Service]的启动、重启、停止命令全部要求使用绝对路径

[]: Unit “服务的说明”

Description:描述服务 After:描述服务类别 [Service]服务运行参数的设置 Type=forking是后台运行的形式 ExecStart为服务的具体运行命令 ExecReload为重启命令 ExecStop为停止命令 PrivateTmp=True表示给服务分配独立的临时空间注意:[Service]的启动、重启、停止命令全部要求使用绝对路径 [Install]运行级别下服务安装的相关设置,可设置为多用户,即系统运行级别为3

保存退出。

2.设置开机启动

1 systemctl enable nginx.service

3.其它命令

3.其它命令 启动nginx服务

1 systemctl start nginx.service

设置开机自启动

1 systemctl enable nginx.service

停止开机自启动

1 systemctl disable nginx.service

查看服务当前状态

1 systemctl status nginx.service

重新启动服务

1 systemctl restart nginx.service

查看所有已启动的服务

1 systemctl list-units –type=service

4.Systemd命令和sysvinit命令的对照表

Sysvinit命令 Systemd命令 备注
service foo start systemctl start foo.service 用来启动一个服务(并不会重启现有的)
service foo stop systemctl stop foo.service 用来停止一个服务(并不会重启现有的)
service foo restart systemctl restart foo.service 用来停止并启动一个服务,
service foo reload systemctl reload foo.service 当支持时,重新装载配置文件而不中断等待操作,
service foo condrestart systemctl condrestart foo.service 如果服务正在运行那么重启它,
service foo status systemctl status foo.service 汇报服务是否正在运行,
ls /etc/rc.d/init.d/ systemctl list-unit-files –type=service 用来列出可以启动或停止的服务列表,
chkconfig foo on systemctl enable foo.service 在下次启动时或满足其他触发条件时设置服务为启用
chkconfig foo off systemctl disable foo.service 在下次启动时或满足其他触发条件时设置服务为禁用
chkconfig foo systemctl is-enabled foo.service 用来检查一个服务在当前环境下被配置为启用还是禁用
chkconfig –list systemctl list-unit-files –type=service 输出在各个运行级别下服务的启用和禁用情况
chkconfig foo –list ls /etc/systemd/system/*.wants/foo.service 用来列出该服务在哪些运行级别下启用和禁用,
chkconfig foo –add systemctl daemon-reload 当您创建新服务文件或者变更设置时使用,
telinit 3 systemctl isolate multi-user.target (OR systemctl isolate runlevel3.target OR telinit 3) 改变至多用户运行级别,

5.Sysvinit运行级别和systemd目标的对应表

Sysvinit运行级别 Systemd目标 备注
0 runlevel0.target, poweroff.target 关闭系统,
1, s, single runlevel1.target, rescue.target 单用户模式,
2, 4 runlevel2.target, runlevel4.target, multi-user.target 用户定义/域特定运行级别。默认等同于3
3 runlevel3.target, multi-user.target 多用户,非图形化。用户可以通过多个控制台或网络登录,
5 runlevel5.target, graphical.target 多用户,图形化。通常为所有运行级别3的服务外加图形化登录
6 runlevel6.target, reboot.target 重启
emergency emergency.target 紧急Shell

Links

上一页
下一页