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

分析上面的配置文件,我们大概能够将整个设定分为三个部份,就是:

  • [Service], [Socket], [Timer], [Mount], [Path]..:不同的 unit type 就得要使用相对应的设定项目。我们拿的是 sshd.service 来当模板,所以这边就使用 [Service] 来设定。 这个项目内主要在规范服务启动的脚本、环境 配置文件档名、重新启动的方式等等。

至于配置文件内有些设定规则还是得要说明一下:

  • 设定项目通常是可以重复的,例如我可以重复设定两个 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 啊!
# 因此执行完毕就完毕了,不会继续存在内存中喔!

转载于:https://www.cnblogs.com/uetucci/p/7761264.html

  • 1
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
Linux的systemctl是一个系统管理守护进程、工具和库的集合,用于取代System V、service和chkconfig命令。它主要负责控制systemd系统和服务管理器。Linux的服务可以通过systemctl来管理。systemctl是一个命令行工具,可以用于启动、停止、重启、查看状态、启用、禁用等操作服务。可以使用systemctl来管理服务的生命周期,包括自动加载和退出。在systemd中,每个服务都被封装在一个单元文件中,这个文件是一个纯文本的ini风格文件,里面包含了有关服务的信息。服务的配置文件通常位于/etc/systemd/system文件夹下。当你更改了相关服务配置文件后,需要运行systemctl daemon-reload命令来重新加载配置,并使用systemctl restart命令重启服务。<span class="em">1</span><span class="em">2</span><span class="em">3</span> #### 引用[.reference_title] - *1* *3* [Linux服务管理命令service与systemctl](https://blog.csdn.net/wangliang888888/article/details/130826098)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v93^chatsearchT3_2"}}] [.reference_item style="max-width: 50%"] - *2* [Linux系统中systemctl命令详解](https://download.csdn.net/download/weixin_38645133/12843115)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v93^chatsearchT3_2"}}] [.reference_item style="max-width: 50%"] [ .reference_list ]

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值