Linux 服务管理和配置

这篇主要是围绕 systemd 的管理和配置,有新的认识会持续更新

一、服务管理

Centos 7 及后续版本

systemd

bash 复制代码
# 无需重启,重新加载服务 一般用于配置文件变更后
systemctl reload daemon
# 服务的开机自启动管理
systemctl enable/disable daemon
# 服务状态的管理
systemctl start/status/stop/restart daemon
# 服务的依赖关系
systemctl list-dependencies daemon

不常用:
	# 获取当前模式
    systemctl get-default 			
    # 设置为纯文本模式		
    systemctl set-default multi-user.target 
    # 临时切换到文本模式
    systemctl isolate multi-user.target 
    # 临时切换到UI模式	
    systemctl isolate graphical.target  	
    # 禁用服务或者解除禁用
    systemctl mask/unmask daemon 			

# 可以显示目前的所有服务状态
systemctl 
# 帮助文档
man systemctl

异常的服务可能会影响系统开机和关机的时长,如果发现开机或者关机时间过长,建议检查启动日志以及开机后服务状态

bash 复制代码
# 查看系统启动日志 默认位置
more /var/log/boot.log
# 可以查看失败的服务
systemctl |grep failed 
Centos 6

initd

bash 复制代码
# 服务状态维护
service daemon start/stop/restart/status
# 服务的自启管理
chkconfig daemon on/off
# 查看服务列表
chkconfig --list daemon
# 服务状态管理,service 无法控制服务时,可以试试这个
/etc/init.d/daemon start/stop/restart/status
# 帮助文档
man service

service 与 inid.d 管理服务的区别

二、服务的相关信息

先找个熟悉的服务 sshd ,看看里面都有些什么吧

详见:man systemctl

bash 复制代码
systemctl status sshd
* sshd.service - OpenSSH server daemon
   Loaded: loaded (/usr/lib/systemd/system/sshd.service; enabled; vendor preset: enabled)
   Active: active (running) since Wed 2020-12-30 16:28:12 CST; 3 months 21 days ago
     Docs: man:sshd(8)
           man:sshd_config(5)
 Main PID: 2593 (sshd)
    Tasks: 1
   Memory: 4.5M
   CGroup: /system.slice/sshd.service
           `-2593 /usr/sbin/sshd -D
           
sshd.service - OpenSSH server daemon   # 服务名称 和 注解
Loaded: loaded (/usr/lib/systemd/system/sshd.service; enabled; vendor preset: enabled)
	loaded 								 # 已加载
	/usr/lib/systemd/system/sshd.service # 服务配置文件路径
	enabled 							 # 开机自启,优先级比系统预设高
	vendor preset: enabled               # 系统预设自启
Active: active (running) since Wed 2020-12-30 16:28:12 CST; 3 months 21 days ago
	active (running)                     # 活动状态正常
	since Wed 2020-12-30 16:28:12 CST; 3 months 21 days ago     # 服务启动时间
-2593 /usr/sbin/sshd -D
    -2593                                # PID进程号2593
    /usr/sbin/sshd -D                    # 服务执行的命令
bash 复制代码
Loaded 状态:
    enabled # 开机自启
    disabled # 没有开机自启
    static # 不可以自启,但是可以让其他服务唤醒
    mask # 不能启动,因为被注销,systemctl unmask daemon可以恢复

Active 状态:
    active (running) # 正常 
    active (exited) # 仅执行一次就正常结束,目前没有正在运行,无需一直执行
    active (waiting) # 正在运行中,在等待其他时间才能处理
    inactive (dead) # 没有运行的服务,一般是stop或者起不来的情况

三、服务配置文件目录

基本概念

service通过daemon程序来实现服务,例如sshd.service 的daemon是sshd程序

服务配置文件路径

自启服务:/etc/systemd/system/

bash 复制代码
# 部分内容
ls -l /etc/systemd/system/
total 8
drwxr-xr-x. 2 root root   57 Jun  3  2020 basic.target.wants
lrwxrwxrwx. 1 root root    9 Jun  4  2020 ctrl-alt-del.target -> /dev/null
lrwxrwxrwx. 1 root root   37 Jun  4  2020 default.target -> /lib/systemd/system/multi-user.target
drwxr-xr-x. 2 root root   87 Jun  3  2020 default.target.wants
drwxr-xr-x. 2 root root 4096 Sep 18 09:31 multi-user.target.wants

ls -l /etc/systemd/system/multi-user.target.wants/sshd.service
lrwxrwxrwx  1 root root 36 Dec 14 17:03 sshd.service -> /usr/lib/systemd/system/sshd.service

# systemctl disable sshd
Removed symlink /etc/systemd/system/multi-user.target.wants/sshd.service.
# systemctl enable sshd
Created symlink from /etc/systemd/system/multi-user.target.wants/sshd.service to /usr/lib/systemd/system/sshd.service.

从上述内容可以看出来,这个目录内是大量的服务的软连接文件,里面存放需要自启的服务

实际服务配置文件

systemd 存放服务配置>> /usr/lib/systemd/system/

init.d 存放脚本,旧版本系统>> /etc/init.d

bash 复制代码
# ls /usr/lib/systemd/system/sshd*
sshd-keygen.service  sshd.service  sshd@.service  sshd.socket

常见服务类型:
    .service : 一般服务类型,也称unit 
    .socket : 内部程序数据交换的插槽服务,主要是 IPC (Inter-process communication) 的传输讯息插槽文件 (socket file) 功能 

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

    .target : 执行环境类型 (target unit),其实是一群 unit 的集合

    .mount/.automount : 文件系统挂载相关的服务 

    .path : 侦测特定文件或目录类型,比如打印服务

    .timer : 循环执行的服务,是由 systemd 主动提供的,比 anacrontab 更加有弹性

系统执行过程中所产生的服务脚本

/run/systemd/system/

bash 复制代码
# ls /run/systemd/system/
    .slice : 暂不清楚
    .scope : 暂不清楚
服务配置文件汇总

/usr/lib/systemd/system/

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

/run/systemd/system/

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

/etc/systemd/system/

管理员依据主机系统的需求所建立的执行脚本,执行优先序又比 /run/systemd/system/ 高

四、服务配置文件内容

systemd.service 中文手册 译者:金步国

详见:man systemd-system.conf

bash 复制代码
[Unit] unit 的说明
	Description 		服务的简单说明
	Documentation 		相关文档位置:配置文件、说明文件等
	After 				说明启动顺序,没有强制要求启动
	Before 				说明启动顺序,没有强制要求启动
	Requires 			设置依赖服务,** 强制要求依赖服务启动才能启动 **
	Wants  				说明相关服务,没有强制要求启动
	Conflicts 			冲突服务设定,相斥服务

[Service] 这个项目内主要在规范服务启动的脚本、环境配置文件档名、重新启动的方式等等
	*Type 说明这个 daemon 启动的方式,会影响到 ExecStart 必须设为 simple, exec, forking, oneshot, dbus, notify, idle 之一
		*simple 默认值,这个 daemon 主要由 ExecStart 接的指令串来启动,启动后常驻于内存中
		*forking 由 ExecStart 启动的程序透过 spawns 延伸出其他子程序,来作为此 daemon 的主要服务。原生的父程序在启动结束后就会终止运作。
		*oneshot simple 类似,不过这个程序在工作完毕后就结束了,不会常驻在内存中
		dbus 与 simple 类似,但这个 daemon 必须要在取得一个 D-Bus 的名称后,才会继续运作!因此设定这个项目时,通常也要设定 BusName= 才行,会自动添加 Requires=dbus.socket 与 After=dbus.socket 依赖
		idle 与 simple 类似,意思是,要执行这个 daemon 必须要所有的工作都顺利执行完毕后才会执行。这类的 daemon 通常是开机到最后才执行即可的服务!
	
	EnvironmentFile 可以指定启动脚本的环境配置文件或者多个不同的 Shell 变量
	
	*ExecStart 就是实际执行此 daemon 的指令或脚本程序
		1) ExecStartPre (之前) 可以指定启动前的额外参数
		2) ExecStartPost (之后) 可以指定启动后的额外参数
		3) 不支持特殊字符,要使用得写入脚本中
		4) Type=oneshot时,可以使用较为完整的bash语法

	ExecStop systemctl stop 的执行有关,关闭此服务时所进行的指令

	ExecReload systemctl reload 有关的指令行为

	Restart Restart=1时,服务终止后会重启,除非用systemctl强制关闭

	RemainAfterExit RemainAfterExit=1 时,当daemon所属程序终止后,服务再尝试重启对oneshot服务有帮助

	TimeoutSec 设置非正常启动或关闭状态下,多久进入强制结束,为避免一些服务会影响系统正常关机,还是考虑添加这个参数

	KillMode 
		process 当daemon 终止时,只会终止主要的程序 (ExecStart 接的后面那串指令)
		control-group 由此 daemon 所产生的其他 control-group 的程序,也都会被关闭
		none 没有程序会被关闭
	
	RestartSec 关闭然后重新启动,sleep多久后再重启,默认100ms,实测没有发现延迟

[Install] 就是将此 unit 安装到哪个 target 里面去的意思
	WantedBy 这个设定后面接的大部分是 *.target unit
		1) 意思是这个 unit 本身是附挂在哪一个 target unit 底下
		2) 一般来说,大多的服务性质的 unit 都是附挂在 multi-user.target 底下
	
	Also 当目前这个 unit 本身被 enable 时,Also 后面接的 unit 也请 enable 的意思

	Alias 进行一个连结的别名的意思
		1) 当 systemctl enable 相关的服务时,则此服务会进行连结档的建立
		2) 例如multi-user.target 与default.target的关系

[Socket] 不同的 unit type 就得要使用相对应的设定项目
[Timer] 这五个都是服务类型,内容是一样的
[Mount]
[Path]
	
内容规则:
	1、设定项目通常是可以重复的,后面设定会覆盖前面的设置,例如同时两个After,只有后面那个After会生效
	2、设定参数是布尔类型时,可以使用 1/0, yes/on, true/false, on/off
	3、空白行、开头为 # 或 ; 的那一行,都代表批注 

"实例化"服务 服务复用:
	源文件(模板文件):执行服务名称@.service
	执行文件:执行服务名称@范例名称.service
	例如:systemctl start getty@tty8.service
相关推荐
人生苦短,菜的抠脚17 分钟前
Linux 内核IIO sensor驱动
linux·驱动开发
jz_ddk29 分钟前
[LVGL] 从0开始,学LVGL:进阶应用与项目实战(上)
linux·信息可视化·嵌入式·gui·lvgl·界面设计
望获linux1 小时前
【实时Linux实战系列】Linux 内核的实时组调度(Real-Time Group Scheduling)
java·linux·服务器·前端·数据库·人工智能·深度学习
MC丶科1 小时前
【SpringBoot常见报错与解决方案】端口被占用?Spring Boot 修改端口号的 3 种方法,第 3 种 90% 的人不知道!
java·linux·spring boot
江公望1 小时前
ubuntu kylin(优麒麟)和标准ubuntu的区别浅谈
linux·服务器·ubuntu·kylin
Lynnxiaowen1 小时前
今天我们开始学习python语句和模块
linux·运维·开发语言·python·学习
生态笔记2 小时前
PPT宏代码
linux·服务器·powerpoint
mucheni2 小时前
迅为RK3588开发板Ubuntu 系统开发ubuntu终端密码登录
linux·运维·ubuntu
skywoodsky2 小时前
Ubuntu 24.04环境下的挂起转休眠
linux
小云数据库服务专线2 小时前
GaussDB 应用侧报Read timed out解决方法
linux·服务器·gaussdb