Linux学习-systemctl 针对 service 类型的配置文件
systemctl 配置文件相关目录简介
现在我们知道服务的管理是透过 systemd,而 systemd 的配置文件大部分放置于 /usr/lib/systemd/system/ 目录内。 该目录的文件主要是原本软件所提供 的设定,建议不要修改!而要修改的位置应该放置于 /etc/systemd/system/ 目录内。举例来说,如果 你想要额外修改 vsftpd.service 的话, 他们建议要放置到哪些地方呢?
- /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 之前,需要事先启动哪些服务的意思。
systemctl 配置文件的设定项目简介
了解了配置文件的相关目录与文件之后,再来,当然得要了解一下配置文件本身的内容了!让我们先 来瞧一瞧 sshd.service 的内容好了!
[root@study ~]# cat /usr/lib/systemd/system/sshd.service
[Unit] # 这个项目与此 unit 的解释、执行服务相依性有关
Description=OpenSSH server daemon
After=network.target sshd-keygen.service
Wants=sshd-keygen.service
[Service] # 这个项目与实际执行的指令参数有关
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 type 就得要使用相对应的设定项目。我们拿的是 sshd.service 来当模板,所以这边就使用 [Service] 来设定。 这个项目内主要在规范服务启动的脚本、环境 配置文件档名、重新启动的方式等等。
- [Install]:这个项目就是将此 unit 安装到哪个 target 里面去的意思!
至于配置文件内有些设定规则还是得要说明一下:
- 设定项目通常是可以重复的,例如我可以重复设定两个 After 在配置文件中,不过,后面的设定会取代前 面的喔!因此,如果你想要将设定值归零, 可以使用类似『 After= 』的设定,亦即该项目的等号后面什么都没有,就将该设定归零了 (reset)。
- 如果设定参数需要有『是/否』的项目 (布尔值, boolean),你可以使用 1, yes, true, on 代表启动,用 0, no, false,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 才能启动。 以 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 变量来给予设定! |
ExecStar | 就是实际执行此 daemon 的指令或脚本程序。你也可以使用 ExecStartPre (之前) 以及 ExecStartPost (之后) 两个设定项目来在实际启动服务前,进行额外的指令行为。 但是你得要特 别注意的是,指令串仅接受『指令 参数 参数...』的格式,不能接受 <, >, >>, |
ExecStop | 与 systemctl stop 的执行有关,关闭此服务时所进行的指令。 |
ExecReload | 与 systemctl reload 有关的指令行为 |
Restart | 当设定 Restart=1 时,则当此 daemon 服务终止后,会再次的启动此服务。举例来说,如果你 在 tty2 使用文字界面登入,操作完毕后注销,基本上,这个时候 tty2 就已经结束服务了。 但 是你会看到屏幕又立刻产生一个新的 tty2 的登入画面等待你的登入!那就是 Restart 的功能! 除非使用 systemctl 强制将此服务关闭,否则这个服务会源源不绝的一直重复产生! |
RemainAfterExit | 当设定为 RemainAfterExit=1 时,则当这个 daemon 所属的所有程序都终止之后,此服务会再 尝试启动。这对于 Type=oneshot 的服务很有帮助! |
TimeoutSec | 若这个服务在启动或者是关闭时,因为某些缘故导致无法顺利『正常启动或正常结束』的情况 下,则我们要等多久才进入『强制结束』的状态! |
KillMode | 可以是 process, control-group, none 的其中一种,如果是 process 则 daemon 终止时,只会终 KillMode 止主要的程序 (ExecStart 接的后面那串指令),如果是 control-group 时, 则由此 daemon 所产生的其他 control-group 的程序,也都会被关闭。如果是 none 的话,则没有程序会被关闭喔! |
RestartSec | 与 Restart 有点相关性,如果这个服务被关闭,然后需要重新启动时,大概要 sleep 多少时间 再重新启动的意思。预设是 100ms (毫秒)。 |
[Install] 部份:
设定参数 | 参数意义说明 |
---|---|
WantedBy | 这个设定后面接的大部分是 *.target unit !意思是,这个 unit 本身是附挂在哪一个 target unit 底下 的!一般来说,大多的服务性质的 unit 都是附挂在 multi-user.target 底下! |
Also | 当目前这个 unit 本身被 enable 时,Also 后面接的 unit 也请 enable 的意思!也就是具有相依性的 服务可以写在这里呢! |
Alias | 进行一个连结的别名的意思!当 systemctl enable 相关的服务时,则此服务会进行连结档的建立!以multi-user.target 为例,这个家伙是用来作为预设操作环境 default.target 的规划, 因此当你设定用成 default.target 时 , 这 个 /etc/systemd/system/default.target 就 会 连 结 到 /usr/lib/systemd/system/multi-user.target 啰! |
两个 vsftpd 运作的实例
vsftpd 的 port 改成 555 号了。不过,因为某些原因,所以你可能需要使用到两个 埠口,分别是正常的 21 以及特殊的 555 ! 这两个 port 都启用的情况下,你可能就得要使用到两 个配置文件以及两个启动脚本设定了!现在假设是这样:
- 预设的 port 21:使用 /etc/vsftpd/vsftpd.conf 配置文件,以及 /usr/lib/systemd/system/vsftpd.service 设定脚本;
- 特殊的 port 555:使用 /etc/vsftpd/vsftpd2.conf 配置文件,以及 /etc/systemd/system/vsftpd2.service 设定脚本。
多重的重复设定方式:以 getty 为例
CentOS7 开机完成后,不是说有 6 个终端机可以使用吗?就是那个 tty1~tty6 的啊!那个东 西是由 agetty 这个指令达成的。那么这个终端机的功能又是从哪个项目所提供的呢?其实, 那个东东涉及很多层面,主要管理的是 getty.target 这个 target unit , 不过,实际产生 tty1~tty6 的 则是由 getty@.service 所提供的!咦!那个 @ 是啥东西?
先来查阅一下 /usr/lib/systemd/system/getty@.service 的内容好了:
[root@study ~]# cat /usr/lib/systemd/system/getty@.service
[Unit]
Description=Getty on %I
Documentation=man:agetty(8) man:systemd-getty-generator(8)
Documentation=http://0pointer.de/blog/projects/serial-console.html
After=systemd-user-sessions.service plymouth-quit-wait.service
After=rc-local.service
Before=getty.target
ConditionPathExists=/dev/tty0
[Service]
ExecStart=-/sbin/agetty --noclear %I $TERM
Type=idle
Restart=always
RestartSec=0
UtmpIdentifier=%I
TTYPath=/dev/%I
TTYReset=yes
TTYVHangup=yes
TTYVTDisallocate=yes
KillMode=process
IgnoreSIGPIPE=no
SendSIGHUP=yes
[Install]
WantedBy=getty.target
比较重要的当然就是 ExecStart 项目啰!那么我们去 man agetty 时,发现到它的语法应该是『 agetty --noclear tty1 』之类的字样, 因此,我们如果要启动六个 tty 的时候,基本上应该要有六个启动配 置文件。亦即是可能会用到 getty1.service, getty2.service...getty6.service 才对!所以,才会出现这个 @ 的项目啦!咦!这个 @ 到底怎么回事呢?我们先来看看 getty@.service 的上游,亦即是 getty.target 这个东西的内容好了!
[root@study ~]# systemctl show getty.target
# 那个 show 的指令可以将 getty.target 的默认设定值也取出来显示!
Names=getty.target
Wants=getty@tty1.service
WantedBy=multi-user.target
Conflicts=shutdown.target
Before=multi-user.target
After=getty@tty1.service getty@tty2.service getty@tty3.service getty@tty4.service getty@tty6.service getty@tty5.service
.....(后面省略).....
咦!怎么会多出六个怪异的 service 呢?我们拿 getty@tty1.service 来说明一下好了!当 我们执行完 getty.target 之后, 他会持续要求 getty@tty1.service 等六个服务继续启动。那我们的 systemd 就会这么作:
- 先看 /usr/lib/systemd/system/, /etc/systemd/system/ 有没有 getty@tty1.service 的设定,若有就执行,若没有 则执行下一步;
- 找 getty@.service 的设定,若有则将 @ 后面的数据带入成 %I 的变量,进入 getty@.service 执行!
这也就是说,其实 getty@tty1.service 实际上是不存在的!他主要是透过 getty@.service 来执行~也 就是说, getty@.service 的目的是为了要简化多个执行的启动设定, 他的命名方式是这样的:
源文件:执行服务名称@.service
执行文件:执行服务名称@范例名称.service
因此当有范例名称带入时,则会有一个新的服务名称产生出来!你再回头看看 getty@.service 的启动 脚本:
ExecStart=-/sbin/agetty --noclear %I $TERM
上表中那个 %I 指的就是『范例名称』!根据 getty.target 的信息输出来看,getty@tty1.service 的 %I 就是 tty1 啰!因此执行脚本就会变成『 /sbin/agetty --noclear tty1 』! 所以我们才有办法以一个配 置文件来启动多个 tty1 给用户登入啰!
- 将 tty 的数量由 6 个降低到 4 个
你应该要感到困扰的是,那么『 6 个 tty 是谁规定的』为什么不是 5 个还是 7 个?这是因为 systemd 的登入配置文件 /etc/systemd/logind.conf 里面规范的啦! 假如你想要让 tty 数量降低到剩 下 4 个的话,那么可以这样实验看看:
# 1. 修改预设的 logind.conf 内容,将原本 6 个虚拟终端机改成 4 个
[root@study ~]# vim /etc/systemd/logind.conf
[Login]
NAutoVTs=4
ReserveVT=0
# 原本是 6 个而且还批注,请取消批注,然后改成 4 吧!
# 2. 关闭不小心启动的 tty5, tty6 并重新启动 getty.target 啰!
[root@study ~]# systemctl stop getty@tty5.service
[root@study ~]# systemctl stop getty@tty6.service
[root@study ~]# systemctl restart systemd-logind.service
- 暂时新增 vsftpd 到 2121 埠口
不知道你有没有发现,其实在 /usr/lib/systemd/system 底下还有个特别的 vsftpd@.service 喔!来看看 他的内容:
[root@study ~]# cat /usr/lib/systemd/system/vsftpd@.service
[Unit]
Description=Vsftpd ftp daemon
After=network.target
PartOf=vsftpd.target
[Service]
Type=forking
ExecStart=/usr/sbin/vsftpd /etc/vsftpd/%i.conf
[Install]
WantedBy=vsftpd.target
根据前面 getty@.service 的说明,我们知道在启动的脚本设定当中, %i 或 %I 就是代表 @ 后面 接的范例文件名的意思! 那我能不能建立 vsftpd3.conf 文件,然后透过该文件来启动新的服务呢? 就来玩玩看!
# 1. 根据 vsftpd@.service 的建议,于 /etc/vsftpd/ 底下先建立新的配置文件
[root@study ~]# cd /etc/vsftpd
[root@study vsftpd]# cp vsftpd.conf vsftpd3.conf
[root@study vsftpd]# vim vsftpd3.conf
listen_port=2121
# 2. 暂时启动这个服务,不要永久启动他!
[root@study vsftpd]# systemctl start vsftpd@vsftpd3.service
[root@study vsftpd]# systemctl status vsftpd@vsftpd3.service
vsftpd@vsftpd3.service - Vsftpd ftp daemon
Loaded: loaded (/usr/lib/systemd/system/vsftpd@.service; disabled)
Active: active (running) since Thu 2015-08-13 01:34:05 CST; 5s ago
[root@study vsftpd]# netstat -tlnp
Active Internet connections (only servers)
Proto Recv-Q Send-Q Local Address Foreign Address State PID/Program name
tcp6 0 0 :::2121 :::* LISTEN 16404/vsftpd
tcp6 0 0 :::555 :::* LISTEN 12672/vsftpd
tcp6 0 0 :::21 :::* LISTEN 12670/vsftpd
tips: 可能发现一件事,为啥这次 FTP 增加了 2121 埠口却不用修改SELinux 呢?这是因为默认启动小于 1024 号码以下的端口口时, 需要使用到 root 的权限,因此小于 1024 以下 埠口的启动较可怕。而这次范例中,我们使用 2121 端口口,他对于系统的影响可能小一些 (其实一样可怕!), 所 以就忽略了 SELinux 的限制了!
自己的服务自己作
我们来模拟自己作一个服务吧!假设我要作一只可以备份自己系统的服务,这只脚本我放在 /backups 底下,内容有点像这样
[root@study ~]# vim /backups/backup.sh
#!/bin/bash
source="/etc /home /root /var/lib /var/spool/{cron,at,mail}"
target="/backups/backup-system-$(date +%Y-%m-%d).tar.gz"
[ ! -d /backups ] && mkdir /backups
tar -zcvf ${target} ${source} &> /backups/backup.log
[root@study ~]# chmod a+x /backups/backup.sh
[root@study ~]# ll /backups/backup.sh
-rwxr-xr-x. 1 root root 220 Aug 13 01:57 /backups/backup.sh
# 记得要有可执行的权限才可以喔!
接下来,我们要如何设计一只名为 backup.service 的启动脚本设定呢?可以这样做喔!
[root@study ~]# vim /etc/systemd/system/backup.service
[Unit]
Description=backup my server
Requires=atd.service
[Service]
Type=simple
ExecStart=/bin/bash -c " echo /backups/backup.sh | at now"
[Install]
WantedBy=multi-user.target
# 因为 ExecStart 里面有用到 at 这个指令,因此, atd.service 就是一定要的服务!
[root@study ~]# systemctl daemon-reload
[root@study ~]# systemctl start backup.service
[root@study ~]# systemctl status backup.service
backup.service - backup my server
Loaded: loaded (/etc/systemd/system/backup.service; disabled)
Active: inactive (dead)
Aug 13 07:50:31 study.centos.vbird systemd[1]: Starting backup my server...
Aug 13 07:50:31 study.centos.vbird bash[20490]: job 8 at Thu Aug 13 07:50:00 2015
Aug 13 07:50:31 study.centos.vbird systemd[1]: Started backup my server.
# 为什么 Active 是 inactive 呢?这是因为我们的服务仅是一个简单的 script 啊!
# 因此执行完毕就完毕了,不会继续存在内存中喔!
Linux学习-systemctl 针对 service 类型的配置文件的更多相关文章
- Linux学习-systemctl 针对 timer 的配置文件
如何使用 systemd 内建的 time 来处理各种任务呢? systemd.timer 的优势 在 archlinux 的官网 wiki 上面有提到,为啥要使用 systemd.timer 呢? ...
- linux学习笔记之文件类型,及目录介绍
引用A:http://www.cnblogs.com/xiaoluo501395377/archive/2013/04/20/3033131.html 引用B:http://www.cnblogs.c ...
- Linux学习——shell编程之环境变量配置文件
小白学习,在学习中总结! shell编程之环境变量配置文件 一:环境变量配置文件 1 shell编程之环境变量配置 变量类型: 用户自定义变量(本地变量) 环境变量 :定义每个用户的操作环境,如pat ...
- linux学习书籍推荐《鸟哥的Linux私房菜》下载
下载地址:点我 <鸟哥的Linux私房菜:基础学习篇>是具有知名度的Linux入门书<鸟哥的Linux私房菜基础学习篇>的最新版,全面而详细地介绍了Linux操作系统.< ...
- Linux学习之三-Linux系统的一些重要配置文件
Linux学习之三-Linux系统的一些重要配置文件 1.网卡配置文件 /etc/sysconfig/network-scripts/ifcfg-eth0 说明: DEVICE=eth0 ...
- Linux学习笔记之Centos7 自定义systemctl服务脚本
0x00 概述 之前工作环境一直使用Centos6版本,脚本一直在使用/etc/init.d/xxx:系统升级到Cento7后,虽然之前的启动脚本也可以使用,但一直没有使用systemctl 的自定义 ...
- Linux学习之用户配置文件详解(十四)
Linux学习之用户配置文件详解 目录 用户信息文件/etc/password 影子文件/etc/shadow 组信息文件/etc/group 组密码文件/etc/gshadow 用户信息文件/etc ...
- linux学习心得之目录树开端与/etc(图文)
linux学习心得之目录树开端与/etc(图文) linux中“一切皆文件”,学习linux一年了,在学习过程中对目录树的一点心得,分享给大家,有不对的地方敬请斧正. 不多说了,先上图: 根目录: / ...
- Linux学习之Centos(三)------系统文件目录及含义详解
Linux学习之Centos 之三------文件目录及含义 在了解了每个文件的相关种类与属性,以及了解了如何更改文件属性/权限的相关信息后,再来要了解的就是, 为什么每套Linux distribu ...
随机推荐
- java命令--jstack 工具
一.介绍 jstack是java虚拟机自带的一种堆栈跟踪工具.jstack用于打印出给定的java进程ID或core file或远程调试服务的Java堆栈信息,如果是在64位机器上,需要指定选项&qu ...
- WPF (VisualChildren)可视化子元素详解
VisualChildrenCount 的 FrameworkElement 实现始终返回 0 或 1. 如果类所要维护的可视化子元素集合的成员数可能超过 1,则这样的类必须重写此属性和 Ge ...
- Unity使用 转载
创建空的ASP.NET MVC3项目,添加对Unity2.0动态库的引用. 方法1:在MSDN上下载Untity2.0,安装后,默认安装在C:\Program Files\Microsoft Unit ...
- Java基础:(八)异常
Throwable可以用来表示任何可以作为异常抛出的类,分为两种:Error和Exception.其中Error用来表示JVM无法处理的错误, Exception又分为两种: 受检异常:需要用try. ...
- 时间日期相关:Date类、DateFormat类、Calendar类
1 Date类 类 Date 表示特定的瞬间,精确到毫秒. 1秒=1000毫秒 毫秒的0点:公元1970年 一月一日,午夜0:00:00 对应的毫秒值就是0 时间和日期的计算,必须依赖毫秒值. Sys ...
- HTML5:使用postMessage实现Ajax跨域请求
HTML5:使用postMessage实现Ajax跨域请求 由于同源策略的限制,Javascript存在跨域通信的问题,典型的跨域问题有iframe与父级的通信等. 常规的几种解决方法: (1) do ...
- [20190611]记录一下github的基本用法
本文记录如何使用github创建项目并上传代码,因为有一段时间没用github了,中途又重装了系统,今天重新使用一下. 然后特地做简要记录: 1. 创建SSH Key SSH Key指一般在C:\Us ...
- Android 读取excel 文件
在面对选择国家地区,选择手机号码区号等信息的时候,常常我们是读取已存好的数据,我现在读取的就是excel里面的数据,所以在此记录下读取的方法以及注意点. 下面就是读取国际地区手机区号的数据效果图: e ...
- iOS - KVO 简单应用
KVO(键值监听)全称 Key Value Observing.使用KVO可以实现视图组件和数据模型的分离,视图作为监听器,当模型的属性值发生变化后,监听器可以做相应的处理.KVO的方法由NSKeyV ...
- Java 反射机制(一)
阅读<Core Java Volume I --- Fundamentals>反射部分,总觉得许多概念艰涩难懂.模棱两可.我想造成这个结果的主要原因可能是Cay S. Horstmann和 ...