特点
- 并行处理所有服务,加速开机流程
- 一经要求就相应的on-demand启动模式
- 服务依赖性的自我检查
- 依daemon功能分类
- 将多个daemons集合为一个群组
- 向下兼容 就有的init服务脚本
配置文件
- /usr/lib/systemd/system/:(优先级:低)每个服务最主要的启动脚本设置(自定义启动服务脚本目录)
- /run/systemd/system/:(优先级:中)系统执行过程中所产生的的服务脚本,这些脚本的优先级要比
/usr/lib/systemd/system/
高 - /etc/systemd/system/:(优先级:高)管理员主机系统要求所建立的服务脚本,执行的优先级又比
/run/systemd/system/
高
systemd的服务单位unit分类
- .service:一般服务类型,主要是系统服务,包括服务器本身所需要的的本地服务以及网络服务等,经常被使用到的服务大多数是此类型。
- .socket:内部数据程序交换socket服务,主要是IPC的传输信息socket文件功能。这种类型的服务通常在监控信息传递的socket文件中,当通过此socket文件传递信息要链接服务时,就根据当时的状态将该用户的要求传送到对应的daemon,若daemon尚未启动,则启动该daemon后再传送用户的要求。使用socket类型的服务一般较少用到,一般用于本地服务,例如图形界面的很多软件都是通过socket来进行本机程序数据交换的操作。
- .target:执行环境类型,其实是一群unit的集合。
- .mount和.automount:文件挂载相关的服务,例如来自网络的自动挂载、NFS文件系统挂载与文件系统相关性比较高的进程管理。
- .path:检测特定文件或目录类型,某些服务需要检测某些特定的目录来提供队列服务,例如打印服务。
- .timer:循环执行的服务,有点类似anacrontab。
使用systemctl管理服务
单一服务(service)的启动、自启、关闭、状态查看
命令格式和参数解读
命令格式:
systemctl [command] [unit]
command包含以下参数:
- start:启动unit
- stop:关闭unit
- restart:重新启动unit
- reload:不关闭unit的情况下,重新加载配置文件
- enable:设置下次开机时,自启动unit
- disable:取消开机自启动unit
- status:查看该unit的状态
- is-active:查看该unit是否在运行
- is-enable:查看该unit是否开机自启动
status输出参数解读
Loaded行
显示开机是否自启动,enabled为自启动,否则不自启
- enabled:unit开机被启动
- disabled:unit开机时不启动
- static:该unit不可以enable,即不可以自启动,但是可以被其他enabled的unit来唤醒,即依赖属性的服务
- mask:无法启动,该服务被注销(不是删除),可以通过systemctl unmask改回默认状态
Active行
显示unit目前的运行状态
- active(running):unit正在运行
- active(exited):unit仅执行一次就结束,目前没有任何进程在系统中执行
- active(waiting):unit正在执行中,不过需要等待触发事件发生才能继续执行
- inactive(dead):unit未在运行
查看系统上所有服务
命令格式和参数解读
命令格式:
systemctl [command] [--typr=TYPE] [-all]
command包含以下参数:
- list-units:依据unit显示目前启动的unit,若加上“-all”才会列出没启动的
- list-units-files:依据/usr/lib/systemd/system内的文件,将所有文件列表说明
TYPE包含以下参数:
- 之前列出的unit类型,包含service、socket、target等
管理不同的操作环境(target)
常用target介绍
Centos7中默认情况下有26个target(使用命令systemctl list-units --type=target --all
查看),而跟操作界面相关性比较高的target有下面几个:
- graphical.target:图形界面模式,命令行+图形界面,已经包含multi-user.target
- multi-user.target:多用户模式,纯命令行模式
- rescue.target:恢复模式,在无法使用root登录的情况下,systemd在启动时会多加一个额外的临时系统,可以取得root权限来维护系统,但是此模式下需要使用chroot来取得原有的系统
- emergency.target:紧急恢复模式,无法使用rescue.target情况下,还需要使用root登录,可以尝试使用此模式
- shutdown.target:关机模式
- getty.target:修改配置文件来改变tty的数量
命令格式和参数解读
命令格式:
systemctl [command] [unit.target]
command包含以下参数:
- get-default:获取目前的target
- set-default:设置默认的target
- isolate:切换到某个target
切换操作模式的简单指令:
- systemctl poweroff:关机
- systemctl reboot:重启
- systemctl suspend:挂起,将系统的状态数据保存在内存中,然后关闭系统的大部分硬件,实际上并未关机,使用开机按钮唤醒,唤醒速度较快
- systemctl hibernate:休眠,将系统的状态数据保存在硬盘中,然后关闭系统,使用开机按钮唤醒,唤醒速度较慢
- systemctl rescue:恢复模式
- systemctl emergency:紧急恢复模式
分析各服务之间的依赖性
命令格式:
systemctl list-dependencies [unit] [--reverse]
参数解释:--reverse 反向追踪谁使用这个unit
与systemd的daemon运行过程相关目录简介
- /usr/lib/systemd/system/:官方软件默认的启动脚本存放位置,此处尽量不要修改,如果需要修改,请到目录/etc/systemd/system/
- /run/systemd/system/:系统执行过程中产生的服务脚本,优先级高于/usr/lib/systemd/system/
- /etc/systemd/system/:管理员依据主机系统需要所建立的脚本,优先级比/run/systemd/system/还高
- /etc/sysconfig/*:几乎所有的服务都会将初始化的一些选项设置写入到这个目录
- /var/lib/:一些会产生数据的服务都会将产生的数据写入到此目录中
- /run/:放置很多daemon的缓存,包括lock文件和pid文件等
关闭网络服务
关闭网络设备发现服务:avahi-daemon
netstat -tulnp
systemctl list-unit -all | grep avahi-daemon
systemctl stop avahi-daemon.service
systemctl stop avahi-daemon.socket
systemctl disable avahi-daemon.service avahi-daemon.socket
netstat -tulnp
systemctl针对.service类型的配置文件
配置文件相关目录
以vsftpd服务为例:
- /usr/lib/systemd/system/vsftpd.service:官方发布的默认配置文件
- /etc/systemd/system/vsftpd.service.d/custom.conf:在/etc/systemd/system下面建立与配置文件相同文件名的目录,但是加上.d的扩展名,然后在该目录下建立配置文件即可,配置文件的扩展名最好是.conf。在这个目录下的文件会
累加其他设置
到 /usr/lib/systemd/system/vsftpd.service中 - /etc/systemd/system/vsftpd.service.wants/*:此目录中的文件为链接文件,设置依赖服务的链接,意思是启动vsftpd.service之后,最好加上该目录下建议的服务
- /etc/systemd/system/vsftpd.service.requires/*:此目录中的文件为链接文件,设置依赖服务的链接,意思是启动vsftpd.service之前,需要事先启动该目录下的服务
配置文件的设置项目
配置文件
以sshd配置文件为例
more /usr/lib/systemd/system/sshd.service
[Unit] # 这个项目与此unit的解释、执行服务依赖性有关
Description=OpenSSH server daemon
Documentation=man:sshd(8) man:sshd_config(5)
After=network.target sshd-keygen.service
Wants=sshd-keygen.service
[Service] # 这个项目与实际执行的命令参数有关
Type=notify
EnvironmentFile=/etc/sysconfig/sshd
ExecStart=/usr/sbin/sshd -D $OPTIONS
ExecReload=/bin/kill -HUP $MAINPID
KillMode=process
Restart=on-failure
RestartSec=42s
[Install] # 这个项目说明此unit要挂载到哪个target下面
WantedBy=multi-user.target
三大项目说明
- [Unit]:unit本身的说明,以及与其他依赖daemon的设置,包括在什么服务之后才启动此unit之类的设置值
- [Service][Socket][Timer][Mount][Path]:不同的unit类型需要使用相对应的设置设置项目。sshd.service需要使用[Service]来设置。此项目主要用来规范服务启动脚本、环境配置文件名、重新启动的方式等等
- [Install]:这个项目说明将此unit安装到哪个target里面
设置规则
- 设置项目通常是可以重复的,例如可以在配置文件中设置两个“After”,不过后面的设置会替换前面的,因此,如果想要设置归零,直接使用“After=”
- 如果设置参数需要有【是/否】的项目(布尔值),可以使用【1/0】、【yes/no】、【true/false】、【on/off】
- 空白行、以#或;开头的行,都代表注释
参数解释
[Unit]参数
- Description:当使用systemctl list-units时,输出给管理员看的建议说明。使用systemctl status时输出的此服务的说明也是这个项目
- Documentation:这个项目在提供管理员能够进行进一步的文件查询的功能,提供的文件可以是以下类型
- Documentation=http://www....
- Documentation=man:sshd(8)
- Documentation=file:/etc/ssh/sshd_config
- After:此unit在哪个daemon启动之后才启动,仅是说明服务启动的顺序,并没有强制要求里面的服务一定要启动之后才启动此unit。这个与Requires的设置有差异
- Before:与After意义相反,是在什么服务启动前最好启动这个服务的意思,仅是规范服务启动的顺序,并非强制要求
- Requires:设置依赖服务,此服务启动之后才能启动本unit,否则不启动本unit
- Wants:与Requires含义相反,此unit之后最好还要启动什么服务,主要是希望建立让用户比较好操作的环境,但是本参数的服务没有启动并不影响本unit
- Conflicts:冲突的服务,如果此参数的服务已经启动,那么本unit不可启动;如果本unit已经启动,那么此参数之后的服务不能再启动
[Service]参数
- Type:说明此daemon的启动方式,会影响到ExecStart,有以下几种类型:
- simple:默认值,这个daemon主要由ExecStart接的命令来启动,启动后常驻于内存
- forking:由ExecStart启动的程序通过spawns扩展出其他子程序来作为此daemon的主要服务,原生的父进程在启动之后会终止运行,大多数传统的unit采用此方式,例如httpd
- oneshot:与simple类似,不过这个进程在工作完毕之后就关闭,不会常驻于内存
- dbus:与simple类似,但这个daemon必须要在获取一个D-Bus的名称后才会继续运行,因此设置此项目是需要设置“BusName=”
- idle:与simple类似,执行这个daemon必须要所有的工作都顺利执行完毕后才会执行,一般是开机后半段执行的服务
- EnvironmentFile:指定启动脚本的环境配置文件
- ExecStart:实际执行此daemon的命令或脚本程序。可以使用ExecStartPre或者ExecStartPost两个设置项目来在启动服务前后,进行额外的命令操作。命令串仅接受【命令 参数 参数......】的格式,不接受>、>>、|、&等特殊字符,很多的bash语法也不支持,因此最好写入命令脚本中。如果要支持完整的bash语法,可以使用Type=oneshot
- ExecStop:与systemctl stop的执行有关
- ExecReload:与systemctl reload的执行有关
- Restart:当设置Restart=1时,则当此daemon服务终止后,会再次启动此服务,即这个服务会源源不断的产生,除非使用systemctl强制将此服务关闭
- RemainAfterExit:当设置RemainAfterExit=1时,则当这个daemon所属的所有程序都终止之后,此服务会再尝试启动,这对于Type=oneshot的服务很有帮助。
- TimeoutSec:若这个服务在启动或者关闭时,因为某些缘故无法顺利“正常启动或者结束”的情况下,则需要等待多久才进入“强制结束”的状态
- KillMode:可以是process、contril-group、none。process:daemon终止时只会终止主要程序,即ExecStart的那串指令;contril-group:此daemon所产生的的其他contril-group的程序都会被关闭;none:没有程序会被关闭
- RestartSec:与ReStart有点相关,如果这个服务被关闭,然后需要重新启动,大概需要sleep多少时间再重新启动,默认是100ms
[Install]参数
- WantedBy:这个设置后面接的大部分是*.target类型的unit。通常情况下为multi-user.target
- Also:当目前这个unit本身被enable时,also后面接的unit也需要enbale
- Alias:进行一个链接别名的作用,和命令alias作用类似
systemctl针对timer的配置文件
优势
- 相对于crond最小的单位到分,systemd 是可以到秒甚至是毫秒
- 由于所有的systemd的服务产生的信息都会被纪录(log),因此比crond在debug上面要更清楚方便的多
- 各项timer的工作可以跟systemd的服务相结合
- 各项timer的工作可以跟control group(cgroup,用来取代/etc/secure/limit.conf的功能)结合,来限制该工作的资源利用
使用要求
- 系统的timer.target一定要启动
- 要有个sname.service的服务存在(sname是你自己指定的名称)
- 要有个sname.timer的时间启动服务存在
配置
配置文件位置
在/etc/systemd/system下面去创建*.timer的配置文件
配置文件参数
- OnActiveSec:当timers.target启动多久之后才执行这个unit
- OnBootSec:当开机完成后多久之后才执行
- OnStartupSec:当systemd第一次启动之后过多久才执行
- OnUnitActiveSec:这个timer配置文件所管理的那个unit服务在最后一次启动后,隔多久后再执行一次的意思
- OnUnitInactiveSec:这个timer配置文件所管理的那个unit服务在最后一次停止后,隔多久再执行一次的意思
- OnCalendar:使用实际时间(非循环时间)的方式来启动服务的意思
- Unit:一般来说不太需要设置,因此如同上面刚刚提到的,基本上我们设置都是sname.server + sname.timer,那如果你的sname并不相同时,那在 .timer的文件中,就得要指定是哪一个 service unit
- Persistent:当使用OnCalendar的设置时,指定该功能要不要持续进行的意思。通常是设置为yes
OnCalendar的时间
基本格式
- 语法:英文星期名称 YYYY-MM-DD HH:MM:SS
- 举例:Thu 2020-04-16 21:34:25
常用的间隔时间单位
- us或usec:微秒
- ms或msec:毫秒
- s, sec, second, seconds:秒
- m, min, minute, minutes:分
- h, hr, hour, hours:时
- d, day, days:日
- w, week, weeks:周
- month, months:月
- y, year, years:年
使用举例
- 隔3小时:3h或3hr或3hours
- 隔300分钟过10秒:10s 300m
- 隔5天又100分钟:100m 5day
通常英文的写法,小单位写前面,大单位写后面~所以先秒、再分、再小时、再天数等
英文常用的口语化日期
now、today、tomorrow、hourly、daily、weekly、monthly、+3h10m、2015-08-16
配制实例
循环运行
要求
- 开机后2小时开始执行一次这个backup.service
- 自从第一次执行后,未来每两天要执行一次backup.service
配制文件
vim /etc/systemd/system/backup.timer
[Unit]
Description=backup my server timer
[Timer]
OnBootSec=2hrs
OnUnitActiveSec=2days
[Install]
WantedBy=multi-user.target
# 只要这样设置就够了!储存离开吧!
systemctl daemon-reload
systemctl enable backup.timer
systemctl restart backup.timer
systemctl list-unit-files|grep backup
backup.service disabled # 这个不需要启动!只要 enable backup.timer 即可!
backup.timer enabled
systemctl show timers.target
ConditionTimestamp=Thu 2015-08-13 14:31:11 CST # timer 这个 unit 启动的时间!
systemctl show backup.service
ExecMainExitTimestamp=Thu 2015-08-13 14:50:19 CST # backup.service 上次执行的时间
systemctl show backup.timer
NextElapseUSecMonotonic=2d 19min 11.540653s # 下一次执行距离 timers.target 的时间
固定日期运行
要求
- 星期天凌晨2点运行这个备份程序一遍
配制文件
vim /etc/systemd/system/backup2.timer
[Unit]
Description=backup my server timer2
[Timer]
OnCalendar=Sun *-*-* 02:00:00
Persistent=true
Unit=backup.service
[Install]
WantedBy=multi-user.target
systemctl daemon-reload
systemctl enable backup2.timer
systemctl start backup2.timer
systemctl show backup2.timer
NextElapseUSecRealtime=45y 7month 1w 6d 10h 30min