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
相关推荐
o(╥﹏╥)7 分钟前
在 Ubuntu 上安装 VS Code
linux·运维·vscode·ubuntu·vs
不爱学英文的码字机器34 分钟前
[Linux] Shell 命令及运行原理
linux·运维·服务器
cdut_suye1 小时前
Linux工具使用指南:从apt管理、gcc编译到makefile构建与gdb调试
java·linux·运维·服务器·c++·人工智能·python
qq_433618441 小时前
shell 编程(三)
linux·运维·服务器
Tlzns1 小时前
Linux网络——UDP的运用
linux·网络·udp
码农土豆1 小时前
PaddlePaddle飞桨Linux系统Docker版安装
linux·docker·paddlepaddle
Hacker_xingchen1 小时前
天融信Linux系统安全问题
linux·运维·系统安全
张暮笛2 小时前
抓取手机HCI日志
linux
大猫和小黄2 小时前
Windows、CentOS环境下搭建自己的版本管理资料库:GitBlit
linux·服务器·windows·git
Joyner20182 小时前
【Linux】ubuntu通过远程命令行启动桌面应用
linux·服务器·ubuntu