Linux:系统服务:CentOS7以后版本

服务的名称被建立之后,被挂上 Linux 使用时,通常在服务的名称之后会加上一个 d

  • systemd 的配置文件放置目录

/usr/lib/systemd/system/:每个服务最主要的启动脚本设定,有点类似以前的 /etc/init.d 底下的文件;

/run/systemd/system/:系统执行过程中所产生的服务脚本,这些脚本的优先序要 /usr/lib/systemd/system/  高!

/etc/systemd/system/:管理员依据主机系统的需求所建立的执行脚本,其实这个目录有点像以前/etc/rc.d/rc5.d/Sxx 之类的功能!执行优先序又/run/systemd/system/ 高喔!

  • systemd unit 类型分类说明

 /usr/lib/systemd/system/ 以下的数据如何区分上述所谓的不同的类型 (type) 呢?很简单!看扩展名!

扩展名

主要服务功能

 

.service

一般服务类型 (service unit):主要是系统服务,包括服务器本身所需要的本地服务以及网络服务都是!比较经常被使用到的服务大多是这种类型! 所以,这也是最常见的类型了!

 

 

 

 

 

 

.socket

内部程序数据交换的插槽服务 (socket unit):主要是 IPC (Inter-process

communication) 的传输讯息插槽文件 (socket file) 功能。 这种类型的服务通常在监控讯息传递的插槽文件,当有透过此插槽文件传递讯息来说要链接服务时,就依据当时的状态将该用户的要求传送到对应的 daemon, 若 daemon 尚未启动,则启动该

daemon 后再传送用户的要求。

 

使用 socket 类型的服务一般是比较不会被用到的服务,因此在开机时通常会稍微延迟启动的时间 (因为比较没有这么常用嘛!)。一般用于本地服务比较多,例如我们的图形界面很多的软件都是透过 socket 来进行本机程序数据交换的行为。 (这与早期的

xinetd 这个 super daemon 有部份的相似喔!)

 

 

.target

执行环境类型 (target unit):其实是一群 unit 的集合,例如上面表格中谈到的 multi-user.target 其实就是一堆服务的集合~也就是说, 选择执行 multi-user.target 就是执行一堆其他 .service 或/ 及 .socket 之类的服务就是了!

.mount

.automount

文件系统挂载相关的服务 (automount unit / mount unit):例如来自网络的自动挂载、NFS 文件系统挂载等与文件系统相关性较高的程序管理。

 

 

.path

侦测特定文件或目录类型 (path unit):某些服务需要侦测某些特定的目录来提供队列服务,例如最常见的打印服务,就是透过侦测打印队列目录来启动打印功能! 这时就得要 .path 的服务类型支持了!

 

.timer

循环执行的服务 (timer unit):这个东西有点类似 anacrontab 喔!不过是由 systemd 主动提供的, 比 anacrontab 更加有弹性!

 systemctl  管理服务

systemctl [command] [unit]

command 主要有:

start     :立刻启动后面接的 unit stop   :立刻关闭后面接的 unit

restart   :立刻关闭后启动后面接的 unit,亦即执行 stop start 的意思reload   :不关闭后面接的 unit 的情况下,重载配置文件,让设定生效enable :设定下次开机时,后面接的 unit 会被启动

disable   :设定下次开机时,后面接的 unit 不会被启动

status    :目前后面接的这个 unit 的状态,会列出有没有正在执行、开机预设执行否、登录等信息等!

is-active :目前有没有正在运作中

is-enable :开机时有没有预设要启用这个 unit

基本上有几个常见的状态:

active (running):正有一只或多只程序正在系统中执行的意思,举例来说,正在执行中的 vsftpd 就是这种模式。

active (exited):仅执行一次就正常结束的服务,目前并没有任何程序在系统中执行。 举例来说,开机或者是挂载时才会进行一次的 quotaon 功能,就是这种模式! quotaon 不须一直执行~只须执行一次之后,就交给文件系统去自行处理啰!通常用 bash shell 写的小型服务,大多是属于这种类型 (无须常驻内存)

active (waiting):正在执行当中,不过还再等待其他的事件才能继续处理。举例来说,打印的队列相关服务就是这种状态! 虽然正在启动中,不过,也需要真的有队列进来 (打印作业) 这样他才会继续唤醒打印机服务来进行下一步打印的功能。

inactive:这个服务目前没有运作的意思。

daemon  的预设状态有没有可能除了 enable/disable之外,还有其他的情况呢?当然有!

enabled:这个 daemon 将在开机时被执行

disabled:这个 daemon 在开机时不会被执行

static:这个 daemon 不可以自己启动 (enable 不可),不过可能会被其他的 enabled 的服务来唤醒 (相依属性的服务)

mask:这个 daemon 无论如何都无法被启动!因为已经被强制注销 (非删除)。可透过 systemctl unmask 方式改回原本状态

 

要关闭 cups.service 时,比较正规的作法是,连同其他两个会唤醒 service 的 cups.socket cups.path 通通关闭,那就没事了! 比较不正规的作法是,那就强迫 cups.service 注销吧!透过 mask的方式来将这个服务注销看看!

systemctl stop cups.service

systemctl mask cups.service

透过这个 mask 功能,你就可以不必管其他相依服务可能会启动到这个想要关闭的服务了!虽然是非正规,不过很有效!

 

透过 systemctl 观察系统上所有的服务

系统上面有多少的服务存在呢?这个时候就得要透过 list-units  list-unit-files 来观察了

systemctl [command] [--type=TYPE] [--all]

command:

list-units      :依据 unit 列出目前有启动的 unit。若加上 --all 才会列出没启动的。

list-unit-files :依据 /usr/lib/systemd/system/ 内的文件,将所有文件列表说明。

--type=TYPE:就是之前提到的 unit type,主要有 service, socket, target 等

范例一:列出系统上面有启动的 unit

[root@study ~]# systemctl

范例二:列出所有已经安装的 unit 有哪些?

[root@study ~]# systemctl list-unit-files

想要知道 service 这种类别的 daemon 而已,而且不论是否已经启动,通通要列出来! 那该如何是好?

systemctl list-units --type=service --all

透过 systemctl 管理不同的操作环境 (target unit)

systemctl list-units --type=target --all

target 主要有底下几个:

graphical.target:就是文字加上图形界面,这个项目已经包含了底下的 multi-user.target 项目!

multi-user.target:纯文本模式!

rescue.target:在无法使用 root 登入的情况下,systemd 在开机时会多加一个额外的暂时系统,与你原本的系统无关。这时你可以取得 root 的权限来维护你的系统。但是这是额外系统,因此可能需要动到 chroot 的方式来取得你原有的系统喔!再后续的章节我们再来谈!

emergency.target:紧急处理系统的错误,还是需要使用 root 登入的情况,在无法使用 rescue.target 时,可以尝试使用这种模式!

getty.target:可以设定你需要几个 tty 之类的,如果想要降低 tty 的项目,可以修改这个东西的配置文件!

systemctl [command] [unit.target]

选项与参数:

command:

get-default :取得目前的 target

set-default :设定后面接的 target 成为默认的操作模式

isolate     :切换到后面接的模式

 systemd 也提供了数个简单的指令给我们切换操作模式之用喔! 大致上如下所示:

systemctl 分析各服务之间的相依

systemctl list-dependencies [unit] [--reverse]

选项与参数:

--reverse :反向追踪谁使用这个 unit 的意思!

范例一:列出目前的 target 环境下,用到什么特别的 unit

systemctl list-dependencies default.target

systemd daemon  运作过程相关的目录

/usr/lib/systemd/system/

使用 CentOS 官方提供的软件安装后,默认的启动脚本配置文件都放在这里,这里的数据尽量不要修改~ 要修改时,请到 /etc/systemd/system 底下修改较佳!

/run/systemd/system/

系统执行过程中所产生的服务脚本,这些脚本的优先序要/usr/lib/systemd/system/ 高!

/etc/systemd/system/

管理员依据主机系统的需求所建立的执行脚本,其实这个目录有点像以前 /etc/rc.d/rc5.d/Sxx 之类的功能! 执行优先序又比 /run/systemd/system/ 高喔!

/etc/sysconfig/*

几乎所有的服务都会将初始化的一些选项设定写入到这个目录下,举例来说,mandb 所要更新的 man page

索引中,需要加入的参数就写入到此目录下的 man-db 当中喔!而网络的设定则写在/etc/sysconfig/network-scripts/ 这个目录内。所以,这个目录内的文件也是挺重要的;

/var/lib/

一些会产生数据的服务都会将他的数据写入到 /var/lib/ 目录中。举例来说,数据库管理系统 Mariadb 的数据库默认就是写入 /var/lib/mysql/ 这个目录下啦!

/run/

放置了好多 daemon 的暂存档,包括 lock file 以及 PID file 等等。

通过systemctl管理socket 服务

sytemctl list-sockets

网络服务与端口口对应

系统上面有没有什么设定可以让服务与埠号对应在一起呢?那就是 /etc/services 

关闭网络服务

先查看网络服务

netstat -tlnup

接下来,用systemctl 查看对应的服务进程

systemctl list-units --all |grep ....

 

systemctl 针对 service 类型的配置文件

现在我们知道服务的管理是透过 systemd,而 systemd 的配置文件大部分放置于/usr/lib/systemd/system/ 目录内。但是 Red Hat 官方文件指出, 该目录的文件主要是原本软件所提供的设定,建议不要修改!而要修改的位置应该放置于 /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为例:

[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]  部份

设定参数

参数意义说明

 

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

与 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  终止时,只会终止主要的程序 (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 啰!

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值