你需要一个 Redis 服务做开发调试,于是你照着教程在一台平平无奇的 Ubunut 安装 Redis 服务并且启动:
接着,你的另一个服务需要用到 6379 端口,但是此时因为 6379 端口被 Redis 服务占用,所以你无法启动另一个服务。
因此你决定要 kill 掉 Redis 服务:
结果,却怎么也无法 kill 掉 Redis 服务。
一时间,你陷入了一个尴尬的境地,去搜索“我的 Redis 怎么也关不掉”,却发现别人面临的场景总是奇奇怪怪,而你,刚刚只是简单地在本地安装了一个 Redis 服务。
终于,你想到,你是用 systemctl 来 start 你的 Redis 服务的,那么,你可以试试用 systemctl 来 stop 你的 Redis 服务?
果然,你又重新“夺回”了 6379 的控制权,你终于可以愉快地启动你的另一个服务了。
于是你下定决心,了解下 systemctl 到底是个什么东西。
首先介绍 systemd
systemd 是一个 Linux 系统基础组件的集合,它提供了一系列强大的功能来管理系统的启动、服务、进程以及资源等。通过 systemd 这些单元的配置和组合,可以灵活地控制系统的各种行为。
人话:systemd 可以理解为大多数 Linux 发行版中用于取代 SysVinit 的初始化系统。如果你去看你 Linux 的第一个进程,你会发现它是 systemd ( sbin/init 是 systemd 的软链接)。
操作系统中的第一个进程,其作用可以理解为:
- 初始化内存管理系统,确定系统内存的布局与可分配资源
- 启动文件系统的相关服务,还会创建并初始化系统的基础服务进程,像负责网络通信的守护进程等
- 是开机后的第一个进程,负责启动其他进程,是所有进程的父进程
但是人们厌倦了 SysVinit 的复杂,于是就有了 systemd 。
systemctl 则是 systemd 的命令行工具,它提供了一组命令来管理系统服务。通过 systemctl ,你可以启动、停止、重启、查看服务的状态。
与之类似,还有 journalctl ,它是 systemd 的日志管理工具,用于查看系统服务的日志。
systemctl 常用命令
服务如何被 systemd 管理
在你 apt install 一个服务的时候,系统会自动帮你创建一个 .service 文件,这个文件就是 systemd 管理的服务的配置文件。
比如 apt install redis-server 之后,你可以看到如下文件。
/etc/init.d/redis-server 是为了兼容 SysVinit 而存在的,并不会被 systemd 所使用。你可以看到其直接书写 shell 脚本,这点为人诟病(不安全、不方便),在 systemd 中,我们可以使用配置文件来管理服务。
/etc/systemd/system/redis.service 是 systemd 管理的服务的配置文件,你可以看到其使用了 systemd 的配置语法。
systemd 的相关守护进程们,会根据这些配置文件,达到程序预期的目的。
如果我自己安装的 binary 文件,没有通过 apt install 安装,那怎么办呢?
很简单,根据需求,自己写一个 .service 文件,然后放到 /etc/systemd/system/ 目录下,然后执行 systemctl enable xxx.service 即可。