Centos7 systemd整理

特点

  • 并行处理所有服务,加速开机流程
  • 一经要求就相应的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