三、systemctl针对service类型的配置文件

1.systemctl配置文件相关目录介绍

我们知道服务的管理是通过systemd,而systemd的配置文件大部分位于/usr/lib/system/system/目录中。但是Red Hat官方文档中,不允许修改这个文件,修改的文件位于/etc/system/system目录内。例如我想要修改vsftpd.service的话,那么应该怎样做呢?

(1)/usr/lib/system/system/vsftpd.service:官方的预置配置文件;

(2)/etc/systemd/system/vsftpd.service.d/custom.conf:在/etc/systemd/system底下建立与配置文件相同文件名的目录,但是要加上.d的后缀名。然后在该目录下新建配置文件即可。另外,配置文件的后缀名最好为.conf。

(3)/etc/system/system/vsftpd.service.wants/*:这里面的文件为快捷方式,设置相依服务的连接,意思是启动了vsftpd.service后,最好再加上这个目录下面建议的服务。

(4)/etc/system/system/vsftpd.service.requires/*:这里面的文件为快捷方式,设置相依服务的连接,意思是启动vsftpd.service之前,需要事先启动的服务

2.systemctl配置文件配置项目介绍

一个配置文件,大概分为三个部分,即:

(1)[Unit]:unit本身的说明文字,以及与其他相依daemon的设定,包括在什么服务之后才能启动本unit之类的;

(2)[Service],[Socket],[Timer],[Mount],[Path]..:不同的unittype就得要使用相对应的设定项目。这个项目内主要在规范服务启动的脚本、环境配置文件档名、重新启动的方式等等。

(3)[Install]:这个项目就是将此unit安装到哪个target里面去的意思。

说明一下:

(1)设定项目通常是可以重复的,例如我可以重复设定两个After在配置文件中,不过,后面的设定会取代前面的喔!因此,如果你想要将设定值归零,可以使用类似『After=』的设定,亦即该项目的等号后面什么都没有,就将该设定归零了(reset)。

(2)如果设定参数需要有『是/否』的项目(布尔值),你可以使用1,yes,true,on代表启动,用0,no,false,off代表关闭!随你喜好选择啰!

(3)空白行、开头为#或;的那一行,都代表注释。

每个部分里面设定的详细内如解释如下:

[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 才能启动。 以 sshd.service 的内容为例,该档案提到 After 后面有 network.target 以及 sshd-keygen.service,但是若这两个 unit 没有启动而强制启动 sshd.service 的话, 那么 sshd.service 应该还是能够启动的!这与 Requires 的设定是有差异的喔!
Before与 After 的意义相反,是在什么服务启动前最好启动这个服务的意思。不过这仅是规范服务启动的顺序,并非强制要求的意思。
Requires明确的定义此 unit 需要在哪个 daemon 启动后才能够启动!就是设定相依服务啦!如果在此项设定的前导服务没有启动,那么此 unit 就不会被启动!
Wants与 Requires 刚好相反,规范的是这个 unit 之后最好还要启动什么服务比较好的意思!不过,并没有明确的规范就是了!主要的目的是希望建立让使用者比较好操作的环境。 因此,这个 Wants 后面接的服务如果没有启动,其实不会影响到这个 unit 本身!
Conflicts代表冲突的服务!亦即这个项目后面接的服务如果有启动,那么我们这个 unit 本身就不能启动!我们 unit 有启动,则此项目后的服务就不能启动! 反正就是冲突性的检查啦!

 

[Service]部份
设定参数参数意义说明
Type说明这个daemon启动的方式,会影响到ExecStart喔!一般来说,有底下几种类型

·                     simple:默认值,这个daemon主要由ExecStart接的指令串来启动,启动后常驻于内存中。

·                     forking:由ExecStart启动的程序透过spawns延伸出其他子程序来作为此daemon的主要服务。原生的父程序在启动结束后就会终止运作。传统的unit服务大多属于这种项目,例如httpd这个WWW服务,当httpd的程序因为运作过久因此即将终结了,则systemd会再重新生出另一个子程序持续运作后,再将父程序删除。据说这样的效能比较好!!

·                     oneshot:与simple类似,不过这个程序在工作完毕后就结束了,不会常驻在内存中。

·                     dbus:与simple类似,但这个daemon必须要在取得一个D-Bus的名称后,才会继续运作!因此设定这个项目时,通常也要设定BusName=才行!

·                     idle:与simple类似,意思是,要执行这个daemon必须要所有的工作都顺利执行完毕后才会执行。这类的daemon通常是开机到最后才执行即可的服务!

比较重要的项目大概是simple,forking与oneshot了!毕竟很多服务需要子程序(forking),而有更多的动作只需要在开机的时候执行一次(oneshot),例如文件系统的检查与挂载啊等等的。

EnvironmentFile可以指定启动脚本的环境配置文件!例如sshd.service的配置文件写入到/etc/sysconfig/sshd当中!你也可以使用Environment=后面接多个不同的Shell变量来给予设定!
ExecStart就是实际执行此daemon的指令或脚本程序。你也可以使用ExecStartPre(之前)以及ExecStartPost(之后)两个设定项目来在实际启动服务前,进行额外的指令行为。但是你得要特别注意的是,指令串仅接受『指令参数参数』的格式,不能接受<,>,>>,|,&等特殊字符,很多的bash语法也不支持喔!所以,要使用这些特殊的字符时,最好直接写入到指令脚本里面去!不过,上述的语法也不是完全不能用,亦即,若要支持比较完整的bash语法,那你得要使用Type=oneshot才行喔!其他的Type才不能支持这些字符。
ExecStop与systemctlstop的执行有关,关闭此服务时所进行的指令。
ExecReload与systemctlreload有关的指令行为
Restart当设定Restart=1时,则当此daemon服务终止后,会再次的启动此服务。举例来说,如果你在tty2使用文字界面登入,操作完毕后注销,基本上,这个时候tty2就已经结束服务了。但是你会看到屏幕又立刻产生一个新的tty2的登入画面等待你的登入!那就是Restart的功能!除非使用systemctl强制将此服务关闭,否则这个服务会源源不绝的一直重复产生!
RemainAfterExit当设定为RemainAfterExit=1时,则当这个daemon所属的所有程序都终止之后,此服务会再尝试启动。这对于Type=oneshot的服务很有帮助!
TimeoutSec若这个服务在启动或者是关闭时,因为某些缘故导致无法顺利『正常启动或正常结束』的情况下,则我们要等多久才进入『强制结束』的状态!
KillMode可以是process,control-group,none的其中一种,如果是process则daemon终止时,只会终止主要的程序(ExecStart接的后面那串指令),如果是control-group时,则由此daemon所产生的其他control-group的程序,也都会被关闭。如果是none的话,则没有程序会被关闭喔!
RestartSec与Restart有点相关性,如果这个服务被关闭,然后需要重新启动时,大概要sleep多少时间再重新启动的意思。预设是100ms(毫秒)。

 

[Install]部份
设定参数参数意义说明
WantedBy这个设定后面接的大部分是*.targetunit!意思是,这个unit本身是附挂在哪一个targetunit底下的!一般来说,大多的服务性质的unit都是附挂在multi-user.target底下!
Also当目前这个unit本身被enable时,Also后面接的unit也请enable的意思!也就是具有相依性的服务可以写在这里呢!
Alias进行一个连接的别名的意思!当systemctl enable相关的服务时,则此服务会进行连结档的建立。

 

四、systemctl针对timer的配置文件

在Windows中有计划任务和启动项一说,如果在Linux中某些服务你想定期执行或开机启动某个服务,可以使用systemd和timers.target来进行处理。

使用systemd.timer的优点:

(1)由于所有的systemd的服务产生的信息都会被记录(log),因此比crond在debug上面要更清楚方便的多;

(2)各项timer的工作可以跟systemd的服务相结合;

(3)各项timer的工作可以跟controlgroup(cgroup,用来取代/etc/secure/limit.conf的功能)结合,来限制该工作的资源利用。

1.任务需求

基本上,想要使用systemd的timer功能,必须要有以下几点:

(1)系统的timer.target必须启动;

(2)要有一个sname.service的服务存在(sname是你自己定的名称);

(3)要有sname.timer的时间启动服务存在。

接下来我们假设用backup.service来进行定期执行。

2.sname.timer的设定值

在/etc/system/system下面新建这个timer文件。内容有以下几点:

[Timer]部份
设定参数参数意义说明
OnActiveSec当timers.target启动多久之后才执行这只unit。
OnBootSec当开机完成后多久之后才执行。
OnStartupSec当systemd第一次启动之后过多久才执行。
OnUnitActiveSec服务在最后一次启动后,隔多久后再执行一次。
OnUnitInactiveSec服务在最后一次停止后,隔多久再执行一次。
OnCalendar使用实际时间的方式来启动服务。
Unit如果你的sname并不相同时,就得要指定是哪一个service unit。
Persistent当使用OnCalendar的设定时,指定该功能要不要持续进行的意思。

至于使用OnCalendar的时间格式,基本语法是:

星期几 YYYY-MM-DD HH:MM:SS

例如:THU 2019-01-07 20:42:44

也可以使用其它方式来指定时间,例如:

(1)us或者usec(微秒);

(2)ms或msec(毫秒);

(3)s, sec, second, seconds;

(4)m, min, minute, minutes;

(5)h, hr, hour, hours;

(6)d, day, days;

(7)w, week, weeks;

(8)month, months;

(9)y, year, years。

此外,可以使用口语化的表达方式,如下表所示:

英文口语实际的时间格式代表英语口语 
nowThu 2019-01-07 20:47:53weeklyMon *-*-* 00:00:00
todayThu 2019-01-07 00:00:00monthly*-*-01 00:00:00
tomorrowThu 2019-01-08 00:00:00+3h10mThu 2019-01-07 23:57:53
hourly*-*-* *:00:002019-01-08TUE 2019-01-08 00:00:00
daily*-*-* 00:00:00