systemd服务详解

systemd服务详解
简介
在centos5中生成和管理用户空间中的进程以及完成系统的初始化使用的是init,并且是依次启动。在centos6中则是使用的upstart,在一定程度上实现了并行启动,但是仍然存在依赖关系,到了centos7中开始使用systemd,真正的实现并行启动、延时按需启动。

systemd的特性
1 启动系统的过程中实现了并行启动
2 由systemd所管理的服务可以实现按需激活
3 支持系统服务状态快照
4 可以定义程序之间依赖关系

unit介绍
unit的配置文件是uit的核心,在配置文件中主要包含

  1. 需要管理服务或者程序
  2. 服务或者程序需要监听的套接字
  3. 保存的系统快照(就是制作快照的时候,系统中各个服务的状态)
  4. 其他和init相关的配置

unit配置文件的位置
/lib/systemd/system 本地配置的系统单元
/run/systemd/system 运行时配置的系统单元
/usr/lib/systemd/system 第三方软件的系统单元(sshd,nginx…)
注意:unit(单元)和init中的服务脚本类似,但是不相同

unit的多种类别
类型1:service unit,这是服务类型的unit,该类unit后缀是 .service,比如nginx.service,通过这个nuit可以实现启动、关闭、查看状态等
该类unit位于 /usr/lib/systemd/system
注意:unit本质上来说并不是脚本,而仅仅是systemd一个配置文件,因此这个unit文件不具有执行权限,而且也无法执行
启动服务的方式:通过让systemd去读取配置文件中的内容,完成nginx进程的启动
类型2:device unit,这是设备unit,该类unit的后缀是.device,这类unit的作用是用来识别设备文件
类型3:mount unit,后缀 .mount,用来实现挂载文件系统到指定的挂载点
类型4:socket unit,后缀.socket,用来表示进程间通信的socket文件
类型5:snapshot nuit:快照unit,后缀.snapshot, 用来管理快照
类型6:target unit:目标unit,后缀是 .target,模拟centos5、6上的运行级别(主要是为了向后兼容)
类型7:swap unit
类型8:path unit

systemd的特性
特性1.:基于socket的激活机制
在启动系统的时候,systemd会将所有要启动的服务都标记已经启动,标记的方式就是将所有要启动的服务的套接字都监听起来,但是是由systemd自己来监听,而不是让具体的服务自己来监听,这样就解决了进程之间的依赖关系。
当某个套接第一次被用户的访问的时候,systemd会立刻启动这个套接字所对应的进程,然后将这个套接字和这个启动的服务做绑定
特性2:基于bus机制激活
特性3:基于device机制激活
特性4:基于path机制激活
可以让systemd监控某个某个目录,当目录中的文件发生更改的时候,立刻激活某个服务
特性5:支持快照机制
特性6:支持域兼容sysV风格的服务管理脚本

systemctl使用举例
1 查看当前系统中全部已经被激活的unit:systemctl list-units --type service
2 查看当前系统中全部的unit(包括未激活的):systemctl list-units --type service --all

开机自启动关闭
设置某个服务开机自启动:systemctl enable nginx.service
禁止某个服务开机自启动:systemctl disable nginx.service
【设置开机自启动,其实就是在/etc/systemd/system/multi-user.target.wants/下创建执行/usr/lib/systemd/system/下的配置文件的软连接】

查看当前系统中的全部unit的自动启动情况:systemctl list-unit-files
state
    disabled:禁止开机自动启动
    enabled:开机自动启动
    static:该unit不能独立运行,是其他unit所依赖的

[root@localhost ~]# cd /etc/systemd/system/multi-user.target.wants/
[root@localhost multi-user.target.wants]# ls -l nginx.service
lrwxrwxrwx. 1 root root 37 3月 25 15:22 nginx.service -> /usr/lib/systemd/system/nginx.service

查看是否自启动
1 查看指定的服务是否开机自动启动
2 systemctl list-unit-files | grep nginx.service
3 systemctl list-unit-files nginx.service
4 systemctl is-enabled nginx.service
5 查看一个unit的依赖关系:systemctl list-dependencies nginx.service
6 优先用reload,如果无法让修改生效,才执行restart:systemctl reload-or-restart nginx.service

禁止使用enable
1 禁止用enable让某服务开机自启动:systemctl mask nginx.service
2 解除禁止mask功能:systemctl unmask nginx.service

注意:所有的.service可以省略

切换级别

1 systemctl使用举例-2
2 切换级别:systemctl isolate name.target

 切换到的救援模式(级别):systemctl rescure.tartet   <<< 切换到救援模式不需要用isolate

查看默认级别

1 查看系统默认的运行级别:systemctl get-default
2 查看当前系统可用的target:systemctl list-units --type target
3 修改系统默认运行级别:systemctl set-default name.target

unit的文件的基本构成

第一部分:unit,用于记录该unit文件的一些通用信息
第二部分:service,记录service具体信息(如何启动、配置文件位置…)
第三部分:install,记录安装信息(运行级别)
复制代码

第一部分:Unit部分
1)Description:对该服务的一个简要说明
2)Before:定义启动顺序,例子:Before=nginx.service,表示该服务需要在nginx启动之前启动
3)After:定义启动顺序,同上
4)Documentation:帮助文档
5)Wants:建议同时启动某服务,比如:Wants=nginx.service 表示系统中最好启动nginx服务,但是即使不启动nginx,当前这个服务也没啥影响
6)Require:当前服务是需要哪个特定的服务的,比如:Require=nginx.service,这就表示当前服务是需要nginx服务,那么在启动当前这个服务的时候,会自动将nginx也启动起来;而且一旦发现nginx服务停止了,那么当前这个服务也就会自动停止
【require无法指定启动次序,需要结合Before After来用,否则经常出现各种问题】
7)Conflicis:当一个服务启动的时候,会立刻停止与之相冲突的服务

第二部分:Service部分
1)Type:指定service的类型
类型1:oneshot:程序执行完成就自动结束了,没有后台进程,比如执行一个shell
类型2:forking:需要一个后台守护进程一直在运行,比如运行nginx、apache、sshd
2)ExecStart:指定如何启动服务(指定启动服务要执行的命令)
如果服务类型是oneshot类型,那么可以直接写上他要执行命令即可,通常不能添加参数和选项
如果服务类型不是oneshot类型,那么在写要执行的命令的时候,可以添加一些参数,比如指定选项、配置文件、用户
【如果要执行多个命令,那么多个命令之间用;分割,如果需要换行可以用 \ 来续行】
3)ExecStartPre, ExecStartPost:指定在执行启动服务之前、之后要执行什么命令
4)ExecStop:停止服务
5)Restart:
6)PIDFile:指定pid文件的路径
第三部分:install部分
WantedBy:指定运行级别,WantedBy=multi-user.target

案例:编写unit文件,并注册到systemd服务中

第一步:准备一个shell脚本
[root@localhost ~]# cat name.sh
#!/bin/bash
echo hostname>/tmp/name.log
第二步:创建unit文件
[root@localhost ~]#cat my.service
[Unit]
Description=this is my first unit file

[Service]
Type=oneshot
ExecStart=/bin/bash /root/name.sh

[Install]
WantedBy=multi-user.target

[root@localhost ~]# mv my.service /usr/lib/systemd/system
第三步:将我的unit文件注册到systemd中
[root@localhost ~]# systemctl enable my.service
Created symlink from /etc/systemd/system/multi-user.target.wants/my.service to /usr/lib/systemd/system/my.service.
第四步:查看该服务的状态
 # systemctl status my.service

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值