系统为了某些功能必须要提供一些服务 (不论是系统本身还是网络方面),这个服务就称为 service 。 但是 service 的提供总是需要程序的运作,所以达成这个 service 的程序称呼为 daemon。
daemon 是一只程序执行后的程序,daemon 程序的命名方式是:服务的名称被建立之后,被挂上 Linux 使用时,通常在服务的名称之后会加上一个 d ,例如:例行性命令的建立的 at, 与 cron 这两个服务, 他的程序文件名会被取为 atd 与 crond,这个 d 代表的就是 daemon 的意思。
CentOS 7.0 以后使用 systemd 这个启动服务管理机制启动脚本。
systemd 将过去的 daemon 执行脚本通通称为一个服务单位 (unit),而每种服务单位 依据功能来区分时,就分类为不同的类型 (type)。 基本的类型有包括系统服务、数据监听与交换的 插槽档服务 (socket)、储存系统状态的快照类型、提供不同类似执行等级分类的操作环境 (target)。配置文件在以下目录:
系统开机会不会执行某些服务看 /etc/systemd/system/ 底下的设定,所以该目录底下就是一大堆连结档。而实际执行的 systemd 启动脚本配置文件, 其实都是放置在 /usr/lib/systemd/system/ 底下。所以修改某个服务启动的设定,应该要去 /usr/lib/systemd/system/ 底下修改。 /etc/systemd/system/ 仅是连结到正确的执行脚本配置文件。
用扩展名区分 /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
命令可以管理服务的启动、关闭、重启、查看状态等。
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 注销的动作,只是让启动的脚本变成空的装置。
使用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
。
列出系统上所有的 target unit 命令: systemctl list-units --type=target --all
。重要的有:
正常的模式是 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 # 强制进入紧急救援模式
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
● │ └─[email protected]
● ├─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 中,如果想修改网络服务与端口口对应可以修改该文件,不过有可能会造成一些协议的错误。
服务的管理是通过 systemd,systemd 的配置文件大部分放置于 /usr/lib/systemd/system/ 目录内。但是 Red Hat 官方文件指出, 该目录的文件主要是原本软件所提供的设定,建议不要修改,而要修改的位置应该放置于 /etc/systemd/system/ 目录内。例如:修改 vsftpd.service ,建议放在:
以 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] 部分详细设定参数:
设定参数 | 参数说明 |
---|---|
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
原文地址:认识系统服务 (daemons)