认识系统服务 (daemons)

系统为了某些功能必须要提供一些服务 (不论是系统本身还是网络方面),这个服务就称为 service 。 但是 service 的提供总是需要程序的运作,所以达成这个 service 的程序称呼为 daemon。 daemon 是一只程序执行后的程序,daemon 程序的命名方式是:服务的名称被建立之后,被挂上 Linux 使用时,通常在服务的名称之后会加上一个 d ,例如:例行性命令的建立的 at, 与 cron 这两个服务, 他的程序文件名会被取为 atd 与 crond,这个 d 代表的就是 daemon 的意思。

systemd 使用的 unit 分类


CentOS 7.0 以后使用 systemd 这个启动服务管理机制启动脚本。

systemd 的配置文件放置目录


systemd 将过去的 daemon 执行脚本通通称为一个服务单位 (unit),而每种服务单位 依据功能来区分时,就分类为不同的类型 (type)。 基本的类型有包括系统服务、数据监听与交换的 插槽档服务 (socket)、储存系统状态的快照类型、提供不同类似执行等级分类的操作环境 (target)。配置文件在以下目录:

  • /usr/lib/systemd/system/(Ubuntu 中在/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/ 高

系统开机会不会执行某些服务看 /etc/systemd/system/ 底下的设定,所以该目录底下就是一大堆连结档。而实际执行的 systemd 启动脚本配置文件, 其实都是放置在 /usr/lib/systemd/system/ 底下。所以修改某个服务启动的设定,应该要去 /usr/lib/systemd/system/ 底下修改。 /etc/systemd/system/ 仅是连结到正确的执行脚本配置文件。

systemd 的 unit 类型分类说明


用扩展名区分 /usr/lib/systemd/system/ 中的数据类型 (type)。如下:

拓展名 主要服务功能
.service 一般服务类型 (service unit):主要是系统服务,包括服务器本身所需要的本地服务以及网络服务,是经常使用到的服务。
.socket 内部程序数据交换的插槽服务 (socket unit):主要是 IPC (Inter-process communication) 的传输讯息插槽文件 (socket file) 功能
.target 执行环境类型 (target unit):是一群 unit 的集合,例如 multi-user.target 是一堆服务的集合,也就是说,选择执行 multi-user.target 就是执行一堆其他 .service 或/及 .socket 之类的服务
.mount .automount 文件系统挂载相关的服务 (automount unit / mount unit):例如来自网络的自动挂载、NFS 文件系统 挂载等与文件系统相关性较高的程序管理
.path 侦测特定文件或目录类型 (path unit):某些服务需要侦测某些特定的目录来提供队列服务,例如最 常见的打印服务,就是透过侦测打印队列目录来启动打印功能
.timer 循环执行的服务 (timer unit):类似 anacrontab,不过是由 systemd 主动提供的, 比 anacrontab 更加有弹性

透过 systemctl 管理服务


通过 systemctl 命令可以管理服务的启动、关闭、重启、查看状态等。

透过 systemctl 管理单一服务 (service unit) 的启动/开机启动与观察状态


systemclt 命令格式:

[root@study ~]# 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 

# 查询 atd 这个服务的状态 
[root@study ~]# systemctl status atd.service 
 atd.service - Job spooling tools
   Loaded: loaded (/usr/lib/systemd/system/atd.service; enabled; vendor preset: enabled)
   Active: active (running) since  2018-10-07 15:54:35 CST; 56min ago
 Main PID: 1189 (atd)
    Tasks: 1
   CGroup: /system.slice/atd.service
           └─1189 /usr/sbin/atd -f

10月 07 15:54:35 centos764 systemd[1]: Started Job spooling tools.
# 重点在第二三行 
# Loaded 行说明开机的时候这个 unit 会不会启动enabled 为开机启动disabled 开机不会启动 
# Active 行说明这个 unit 的状态是正在执行 (running) 或没有执行 (dead) 
# 后面几行则是说明这个 unit 程序的 PID 状态以及最后一行显示这个服务的登录文件信息 
# 登录文件信息格式为时间 讯息发送主机 哪一个服务的讯息 实际讯息内容 
# 所以上面的显示讯息是这个 atd 预设开机就启动而且现在正在运作的意思 

服务的常见目前状态:

状态 含义
active(running) 有一只或多只程序正在系统中执行
active(exited) 仅执行一次就正常结束的服务,目前并没有任何程序在系统中执行。 举例来说,开机或者 是挂载时才会进行一次的 quotaon 功能
active(waiting) 正在执行当中,不过要等待其他的事件才能继续处理。例如:打印的队列相关服务 就是这种状态,虽然正在启动中,不过也需要真的有队列进来 (打印作业) 这样他才会继续唤醒打印机 服务来进行下一步打印的功能
inactive 这个服务没有运行

服务的常见预设状态:

状态 含义
enabled 这个 daemon 在开机时被执行
disabled 这个 daemon 在开机时不被执行
static 这个 daemon 不可以自己启动 (不能 enable),可能会被其他的 enabled 的服务来唤醒 (相依属 性的服务)
mask 这个 daemon 无论如何都无法被启动,已经被强制注销 (非删除)。可透过 systemctl unmask 方 式改回原本状态
# 设置 chronyd 开机不自启
[root@study ~]# systemctl disable chronyd.service 
rm '/etc/systemd/system/multi-user.target.wants/chronyd.service' 

可以看出仅是从 /etc/systemd/system 底下删除一条连结文件。

# 注销 cups 
[root@study ~]# systemctl mask cups.service 
ln -s '/dev/null' '/etc/systemd/system/cups.service' 

可以看出mask 注销的动作,只是让启动的脚本变成空的装置。

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


使用list-units 及 list-unit-files 参数观察系统上面所有服务。命令格式如下:

[root@study ~]# 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                      LOAD   ACTIVE SUB       DESCRIPTION 
proc-sys-fs-binfmt_mis... loaded active waiting   Arbitrary Executable File Formats File System 
.....(中间省略)..... 
LOAD   = Reflects whether the unit definition was properly loaded. 
ACTIVE = The high-level unit activation state, i.e. generalization of SUB. 
SUB    = The low-level unit activation state, values depend on unit type. 

141 loaded units listed. Pass --all to see loaded but inactive units, too. 
To show all installed unit files use 'systemctl list-unit-files'. 
# 列出的项目中,主要的意义是: 
# UNIT   :项目的名称,包括各个 unit 的类别 (看扩展名) 
# LOAD   :开机时是否会被加载,默认 systemctl 显示的是有加载的项目而已 
# ACTIVE :目前的状态,须与后续的 SUB 搭配!就是我们用 systemctl status 观察时,active 的项目!
# DESCRIPTION :详细描述 
# systemctl 都不加参数,其实预设就是 list-units 的意思! 

# 列出所有已经安装的 unit 
[root@study ~]# systemctl list-unit-files 
UNIT FILE                                   STATE 
proc-sys-fs-binfmt_misc.automount           static 
.....(中间省略)..... 
systemd-tmpfiles-clean.timer                static 

336 unit files listed. 

仅列出 service 这种类别的 daemon,使用命令 systemctl list-units --type=service --all

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


列出系统上所有的 target unit 命令: systemctl list-units --type=target --all 。重要的有:

  • graphical.target:就是文字加上图形界面,这个项目已经包含了底下的 multi-user.target 项目
  • multi-user.target:纯文本模式
  • rescue.target:在无法使用 root 登入的情况下,systemd 在开机时会多加一个额外的暂时系统,与你原本的系统无关。这时你可以取得 root 的权限来维护你的系统。 但是这是额外系统,因此可能需要动到 chroot 的 方式来取得你原有的系统
  • emergency.target:紧急处理系统的错误,还是需要使用 root 登入的情况,在无法使用 rescue.target 时,可 以尝试使用这种模式
  • shutdown.target:就是关机的流程
  • getty.target:可以设定你需要几个 tty 之类的,如果想要降低 tty 的项目,可以修改这个东西的配置文件

正常的模式是 multi-user.target 以及 graphical.target,救援方面的模式主要是 rescue.target 以及 更严重的 emergency.target。 最常使用的是 multi-user 以及 graphical 。 查看、修改命令如下:

[root@study ~]# systemctl [command] [unit.target] 
选项与参数: 
command:     
get-default :取得目前的 target      
set-default :设定后面接的 target 成为默认的操作模式     
isolate     :切换到后面接的模式 

# 观察当前模式,并将默认模式转为文字界面 
[root@study ~]# systemctl get-default  
graphical.target  # 是图形界面 

[root@study ~]# systemctl set-default multi-user.target 
[root@study ~]# systemctl get-default  
multi-user.target 

# 在不重新启动的情况下,将目前的操作环境改为纯文本模式,关掉图形界面 
[root@study ~]# systemctl isolate multi-user.target 

# 若需要重新取得图形界面 
[root@study ~]# systemctl isolate graphical.target

在 service 部分用start/stop/restart ,在 target 项目则使用 isolate (隔离不同的操作模式)。方便起见systemd 也提供了数个简单的指令给我们切换操作模式用:

[root@study ~]# systemctl poweroff  # 系统关机 
[root@study ~]# systemctl reboot    # 重新启动 
[root@study ~]# systemctl suspend   # 进入暂停模式 
[root@study ~]# systemctl hibernate # 进入休眠模式 
[root@study ~]# systemctl rescue    # 强制进入救援模式 
[root@study ~]# systemctl emergency # 强制进入紧急救援模式 
  • suspend:暂停模式会将系统的状态数据保存到内存中,然后关闭掉大部分的系统硬件,当然,并没有实际 关机, 当用户按下唤醒机器的按钮,系统数据会重内存中回复,然后重新驱动被大部分关闭的硬件,就 开始正常运作!唤醒的速度较快。 如果在虚拟机中执行此命令,该虚拟机会挂起(暂停)。
  • hibernate:休眠模式则是将系统状态保存到硬盘当中,保存完毕后,将计算机关机。当用户尝试唤醒系统时, 系统会开始正常运作, 然后将保存在硬盘中的系统状态恢复回来。因为数据是由硬盘读出,因此唤醒的效 能与你的硬盘速度有关。 在虚拟机中执行此命令,会进入开机选择页面。

透过 systemctl 分析各服务之间的相依性


systemd 有时候会有相依性,例如 graphical.target 会用到 multi-user.target,查看命令如下:

[root@study ~]# systemctl list-dependencies [unit] [--reverse] 
选项与参数: --reverse :反向追踪谁使用这个 unit 的意思 

# 列出目前的 target 环境下,用到什么特别的 unit 
[root@study ~]# systemctl get-default 
multi-user.target 

[root@study ~]# systemctl list-dependencies 
default.target
● ├─abrt-ccpp.service
● ├─abrt-oops.service
● ├─abrt-vmcore.service
● ├─abrt-xorg.service
● ├─abrtd.service
● ├─atd.service
.....(中间省略)..... 
● ├─getty.target
● │ └─getty@tty1.service
● ├─nfs-client.target
● │ ├─auth-rpcgss-module.service
● │ ├─rpc-statd-notify.service
● │ └─remote-fs-pre.target
● └─remote-fs.target
●   └─nfs-client.target
●     ├─auth-rpcgss-module.service
●     ├─rpc-statd-notify.service
●     └─remote-fs-pre.target

# 查看有哪些服务使用 multi-user.target 
[root@study ~]# systemctl list-dependencies multi-user.target --reverse
multi-user.target
● └─graphical.target

另外,网络服务与端口口对应记录在 /etc/service 中,如果想修改网络服务与端口口对应可以修改该文件,不过有可能会造成一些协议的错误。

systemctl 针对 service 类型的配置文件


systemctl 配置文件相关目录简介


服务的管理是通过 systemd,systemd 的配置文件大部分放置于 /usr/lib/systemd/system/ 目录内。但是 Red Hat 官方文件指出, 该目录的文件主要是原本软件所提供的设定,建议不要修改,而要修改的位置应该放置于 /etc/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@centos764 ~]# cat /usr/lib/systemd/system/sshd.service 
[Unit]        # 此 unit 的解释、执行服务相依性 
Description=OpenSSH server daemon
Documentation=man:sshd(8) man:sshd_config(5)
After=network.target sshd-keygen.service
Wants=sshd-keygen.service

[Service]     # 实际执行的指令参数
Type=notify
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 就得要使用相对应的设定项目。 这个项目内主要在规范服务启动的脚本、环境配置文件档名、重新启动的方式
  • [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(类似) 或 Documentation=file:/etc/...
After 说明此 unit 是在哪个 daemon 启动之后才启动的意思,基本上仅是说明服务启动的顺序而已, 并没有强制要求里头的服务一定要启动后此 unit 才能启动
Before 与 After 的意义相反,是在什么服务启动前最好启动这个服务。不过这仅是规范服务启动 的顺序,并非强制要求
Requires 明确的定义此 unit 需要在哪个 daemon 启动后才能够启动!就是设定相依服务!如果在此项 设定的前导服务没有启动,那么此 unit 就不会被启动!
Wants 规范的是这个 unit 之后最好还要启动什么服务比较好的意思,不过,并 没有明确的规范,主要的目的是希望建立让使用者比较好操作的环境。 因此,这个 Wants 后面接的服务如果没有启动,其实不会影响到这个 unit 本身
Conflicts 代表冲突的服务!即这个项目后面接的服务如果有启动,那么我们这个 unit 本身就不能启动! 我们 unit 有启动,则此项目后的服务就不能启动

[Service] 部分详细设定参数:

设定参数 参数意义说明
Type 说明这个 daemon 启动的方式,会影响到 ExecStart,比较重要的选项是 simple, forking 与 oneshot
ExecStart 就是实际执行此 daemon 的指令或脚本程序
Restart 设定重新启动的条件

[Install] 部分详细设定参数:

设定参数 参数意义说明
WantedBy 这个设定后面接的大部分是 *.target unit,说明此 unit 附挂在哪一个 target unit 底下 ,一般来说,大多的服务性质的 unit 都是附挂在 multi-user.target 下
Also 当目前这个 unit 本身被 enable 时,Also 后面接的 unit 也 enable 的意思,也就是具有相依性的 服务可以写在这里

如果修改了此文件,执行 systemctl deamon-reload 命令重新加载此服务。

自动启动 Gunicorn 服务的范例:

# /lib/systemd/system/gunicorn-zzzsdust.com.conf.service

[Unit]
After=syslog.target network.target remote-fs.target nss-lookup.target
[Service]
# 你的用户
User=zzz
# 你的目录
WorkingDirectory=/home/zzz/sites/zzzsdust.com/blogproject
# gunicorn启动命令
ExecStart=/home/zzz/env/dj_env/bin/gunicorn --bind unix:/tmp/zzzsdust.com.socket blogproject.wsgi:application
Restart=on-failure
[Install]
WantedBy=multi-user.target

CentOS 7.x 预设启动的服务简易说明


  • atd: (系统)单一的例行性工作排程,抵挡机制的配置文件在 /etc/at.{allow,deny} 中
  • auditd: 可以让系统需 SELinux 稽核的信息写入 /var/log/audit/audit.log
  • cpupower: (系统)提供 CPU 的运作规范,可以参考 /etc/sysconfig/cpupower 得到更多的信息
  • crond:(系统)系统配置文件为 /etc/crontab
  • firewalld:(系统/网络)就是防火墙,以前有 iptables 与 ip6tables 等防火墙机制,新的 firewalld 搭配 firewall-cmd 指令,可以快速的建置好你的防火墙系统
  • rsyslog: (系统)这个服务可以记录系统所产生的各项讯息, 包括 /var/log/messages 内的几个重要的登录档



发表评论

评论列表,共 3 条评论

  • EllReobix
    Amoxicillin Enterobacter <a href=http://kamxl.com></a> Cialis Caracteristicas Alternativas Del Viagra
  • okdxce
    <a href=http://levitranew.com>buy online levitra in usa</a> levitra and ibuprofen http://levitranew.com
  • xuwemf
    <a href=http://canadian-pharmacie.com>mail order viagra</a> generic viagra online south africa http://canadian-pharmacie.com