三、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。
此外,可以使用口语化的表达方式,如下表所示:
英文口语 | 实际的时间格式代表 | 英语口语 | |
now | Thu 2019-01-07 20:47:53 | weekly | Mon *-*-* 00:00:00 |
today | Thu 2019-01-07 00:00:00 | monthly | *-*-01 00:00:00 |
tomorrow | Thu 2019-01-08 00:00:00 | +3h10m | Thu 2019-01-07 23:57:53 |
hourly | *-*-* *:00:00 | 2019-01-08 | TUE 2019-01-08 00:00:00 |
daily | *-*-* 00:00:00 |