【systemctl、service】System V init 风格服务

15 阅读13分钟

1.一般建议,你如果服务是旧的systemV服务,就不别用systemctl来启动服务,会导致你在systemctl把服务启动起来,但是状态不一定是对的,而且service上也控制不了了。

2.就是systemd启动的服务优先用systemctl来管理

如果不是,那么就用service来管理

3.理论你用service来控制systemd服务,系统会自动转换兼容,你可以看到提示,自动转换成systemctl,这种没事。

但是反过来你用systemctl来控制systemV(service),就会有很多奇奇怪怪的问题。。。

以下是两张redis服务分别使用service查看和systemctl查看状态的不同截图:

systemctl status redis-server

这就是用systemctl调用systemV服务的弊端了,你应该用service status redis来看,毕竟这个redis服务不是systemd启动的,你也看不到是否active了

service redis status查看状态

1.什么是System V init 风格服务

System V init(简称 SysVinit)风格服务是类 Unix 操作系统中传统的初始化系统管理方式,它源自 Unix System V 发行版。SysVinit 作为系统启动后第一个运行的进程(进程号为1),负责后续系统初始化、启动必要的系统服务,并根据配置设定系统的运行级别(runlevels),以控制哪些服务应当运行或停止。

SysVinit 风格服务的主要特点包括:

  1. 运行级别:SysVinit 定义了一系列运行级别(如运行级别1通常代表单用户模式,运行级别3为多用户无图形界面,运行级别5为图形界面等),通过改变运行级别,可以控制系统的运行状态和服务组合。
  2. 服务脚本:每个系统服务都对应一个位于 /etc/init.d//etc/rc.d/init.d/ 目录下的启动脚本,这些脚本通常包含启动、停止、重启等操作的命令集。这些脚本通过接收如 start, stop, restart, status 等参数来执行相应的操作。
  3. 链接机制:为了实现在不同运行级别的服务管理,SysVinit 会在 /etc/rc[0-6].d/ 目录下创建指向 /etc/init.d/ 中服务脚本的符号链接,并以 S(Start)或 K(Kill)开头加上两位数字表示启动顺序或关闭顺序。
  4. inittab 配置:SysVinit 的配置文件通常是 /etc/inittab,它定义了系统的默认运行级别、控制终端行为等系统初始化参数。
  5. 顺序启动:SysVinit 服务以一定的顺序串行启动,这意味着服务之间没有内置的依赖管理机制,需要手动在脚本中处理依赖关系。

随着技术的发展,Systemd 等现代化初始化系统逐渐取代了 SysVinit,提供了更快的启动速度、并行服务启动、更精细的服务控制和依赖管理等优势。但在一些旧系统或特定应用场景中,SysVinit 风格的服务管理仍在使用。

2.Systemd和systemctl 有什么不同

Systemdsystemctl 是Linux系统管理和初始化的两个相关但不同的概念。

Systemd

Systemd 是 Linux 操作系统中的一种初始化系统(init system),它的设计目标是提供更快的启动速度、更高效的系统服务管理以及更灵活的系统状态监控。Systemd 不仅仅管理系统的启动过程,还负责系统守护进程(服务)的启动、停止、管理和监控,以及处理系统运行级别切换等功能。它是很多现代 Linux 发行版(如 Fedora、CentOS 7及以上、Ubuntu 15.04及以上等)的默认初始化系统。

systemctl

systemctl 是 Systemd 的主要命令行界面工具,用于控制系统和服务管理的各种操作。通过 systemctl,用户和管理员可以轻松地启动、停止、重启服务,查看服务状态,启用或禁用服务的自动启动,以及进行其他系统管理任务。它是与 Systemd 初始化系统交互的主要方式。一些典型的 systemctl 命令包括:

  • systemctl start <service>:启动服务
  • systemctl stop <service>:停止服务
  • systemctl restart <service>:重启服务
  • systemctl status <service>:查看服务状态
  • systemctl enable <service>:设置服务开机启动
  • systemctl disable <service>:取消服务开机启动

总结

简而言之,Systemd 是一种初始化系统,负责整个Linux操作系统的基本管理任务,包括但不限于服务管理。而 systemctl 是与 Systemd 进行交互的命令行工具,用于执行具体的系统和服务管理操作。如果你的系统使用的是 Systemd,那么你将频繁地使用 systemctl 来控制服务和进行系统配置。

2.service与systemctl 有什么不同

servicesystemctl 是 Linux 系统中用于管理服务的两种不同命令,它们的主要区别如下:

  1. 初始化系统支持
    • service 命令主要用于 SysVinit 初始化系统,这是 Linux 系统中较早的初始化方法。
    • systemctl 则是 Systemd 初始化系统的一部分,Systemd 是现代 Linux 发行版中广泛采用的更为先进的初始化系统。
  1. 功能和灵活性
    • systemctl 提供了更多的功能和选项,包括但不限于查看服务状态、启动、停止、重启、重载服务,还可以管理服务的启用/禁用状态、查看服务依赖关系、设置服务启动顺序等。
    • service 命令的功能相对有限,主要支持启动、停止、重启服务等基本操作,不提供 systemctl 那样丰富的管理选项。
  1. 并行启动与性能
    • Systemd(及 systemctl)设计上支持服务的并行启动,这大大减少了系统启动所需的时间。
    • SysVinit(及 service)采用串行启动服务,导致启动速度较慢。
  1. 服务配置文件位置
    • Systemd 服务单元文件(.service 文件)通常位于 /etc/systemd/system//lib/systemd/system/
    • SysVinit 服务脚本则通常位于 /etc/init.d/
  1. 服务控制方式
    • 使用 systemctl 可以对整个系统的服务进行统一管理,包括 Systemd 和 SysVinit 风格的服务(通过兼容层),而 service 主要针对 SysVinit 风格的服务。
  1. 命令结构和易用性
    • systemctl 的命令结构更加一致和直观,例如使用 systemctl start service_name 启动服务,systemctl status service_name 查看服务状态。
    • service 命令结构基于旧有的服务脚本,虽然简单,但在复杂操作上不如 systemctl 灵活。

综上,systemctl 是在现代 Linux 系统中管理服务的首选工具,因为它提供了更高效、更灵活的服务管理能力,而 service 则更多地用于兼容遗留系统或特定服务。随着 Systemd 的普及,越来越多的系统和应用正在向 Systemd 方案迁移。

3.什么时候用service或者systemctl

选择使用 service 或者 systemctl 命令取决于你的 Linux 系统使用的是哪种初始化系统:

使用 service 的情况:

  • 当你的系统还在使用传统的 SysVinit 初始化系统时,应该使用 service 命令来管理服务。这通常发生在一些较老的 Linux 发行版或者特定配置的系统上。
  • 即使在某些使用 Systemd 的系统中,对于那些仍然兼容 SysVinit 样式服务脚本的服务,你也可以使用 service,但通常推荐使用 systemctl 以利用其更全面的功能。

使用 systemctl 的情况:

  • 对于大多数现代 Linux 发行版,包括 Ubuntu 15.04 及以上版本、CentOS 7 及以上版本、Fedora、Debian 8 及以上版本等,由于它们默认采用 Systemd 作为初始化系统,你应该使用 systemctl 命令来管理服务。
  • 当你需要执行更复杂的操作,如查看服务状态详情、管理服务的启用/禁用状态、查看服务依赖关系等时,systemctl 提供了更多高级功能,是更优的选择。
  • 如果要管理系统启动目标(target)或进行更精细的系统单元管理,也应使用 systemctl

总结来说,如果你不确定应该使用哪个命令,可以先检查你的系统是否使用 Systemd(通过 systemctl --version 命令)。如果是,优先使用 systemctl;如果不是,或者在特定情境下必须使用旧服务脚本,那么使用 service。在现代 Linux 环境下,systemctl 的适用范围更广,功能也更加全面。

4.使用systemctl 有什么弊端

尽管 systemctl 和 Systemd 为 Linux 系统管理带来了许多改进和现代化特性,但它们也存在一些被用户和系统管理员指出的弊端或挑战:

  1. 学习曲线:对于长期使用传统 SysVinit 系统的用户和管理员来说,转向 Systemd 和 systemctl 可能需要一定的学习成本,因为它们引入了一套全新的概念和命令集。
  2. 复杂性增加:Systemd 引入了更复杂的配置文件(单元文件)和更多的依赖关系,这可能导致理解和调试系统服务行为变得更加复杂。
  3. 资源消耗:一些用户报告 Systemd 相比 SysVinit 消耗更多的系统资源,尤其是在小型设备或资源有限的环境中,这可能是一个考虑因素。
  4. 兼容性问题:虽然大多数现代 Linux 发行版已广泛采用 Systemd,但某些老旧软件或自定义服务可能没有针对 Systemd 进行优化,导致配置和管理上的不便。
  5. 稳定性争议:尽管 Systemd 已经成熟稳定,但在其早期阶段,一些用户和开发者对其稳定性有所顾虑,担心新引入的复杂性可能引入新的故障点。
  6. 集中化控制:Systemd 提供了一个高度集成的系统管理方式,这有时被视为对系统灵活性的限制,特别是对于那些偏好轻量级、模块化系统管理的用户。
  7. 安全争议:一些安全专家曾对 Systemd 的设计提出批评,认为其庞大的功能集合可能增加攻击面,尽管这些问题随着不断的更新和审查已得到缓解。
  8. 社区分歧:Systemd 的引入在开源社区内引发了较大的争议和分裂,一些开发者和用户因其设计理念和项目管理方式而选择了其他替代方案。

尽管存在这些弊端,Systemd 和 systemctl 仍然因其实现的诸多优点(如更快的启动时间、更好的服务依赖管理、更丰富的日志功能等)而被广泛采纳。对于大多数用户而言,适应 Systemd 成为了现代 Linux 使用的一个重要部分。

5.systemd启动的服务优先用systemctl来管理,否则就用service来管理

如果服务是为Systemd设计并使用Systemd单元文件(通常位于/etc/systemd/system//lib/systemd/system/目录下),那么推荐使用systemctl来管理这些服务,因为systemctl能够充分利用Systemd提供的所有功能,包括更精细的控制选项、依赖关系处理以及系统状态查询等。

而对于那些尚未迁移至Systemd,仍旧使用SysVinit风格的服务脚本(通常位于/etc/init.d/目录下),则应使用service命令来管理。这是因为service命令直接与SysVinit兼容,能够正确地启动、停止和管理这些服务。

总结来说,根据服务所依赖的初始化系统来选择合适的管理工具是最佳实践。在现代Linux系统中,尤其是新版的发行版,默认倾向于使用Systemd及systemctl,而在一些特殊场景或较旧系统中,则可能需要使用service

6.如何选择 systemctl 或 service 管理服务

选择相应管理工具的原因主要是出于兼容性和功能性的考虑:

  1. 兼容性
    • 使用 systemctl 管理 Systemd 服务是因为它直接与 Systemd 初始化系统交互,能够确保服务按照 Systemd 的设计意图正确启动、运行和管理。Systemd 服务单元文件包含了服务的详细配置,包括依赖关系、环境变量、重启策略等,这些信息只能通过 systemctl 得以充分利用。
    • 对于 SysVinit 风格的服务,使用 service 是因为这个命令是专门为与 SysVinit 系统配合而设计的,能够正确解析和执行 /etc/init.d/ 目录下的脚本,保证服务管理的兼容性和稳定性。
  1. 功能性
    • Systemd 及其 systemctl 命令提供了更高级和丰富的管理功能,比如按需启动服务、并行启动以加快系统启动速度、精细的日志记录、以及服务依赖关系的自动化管理等。这些特性使得 Systemd 更适合现代系统的需求,特别是在资源管理、故障排查和系统效率方面。
    • 而 SysVinit 和 service 命令虽然功能相对基础,但在简单的服务管理和旧系统环境中已经足够,且对于那些不依赖 Systemd 特性或需要保持向后兼容的场景更为合适。
  1. 标准化和现代化
    • 随着 Linux 发行版逐渐采用 Systemd 作为默认初始化系统,使用 systemctl 成为了行业标准和最佳实践,特别是在新部署的系统和服务上。这有助于统一管理接口,减少维护成本,并且能够利用最新的系统管理技术。

综上所述,选择 systemctlservice 管理服务的根本原因是确保服务管理操作与当前系统的初始化架构相匹配,以实现最佳的兼容性、功能性和系统效率。

7.如何判断服务是SysVinit 风格还是其他风格

以Redis服务为例子, 判断 Redis 是否为 SysVinit 风格的服务,你可以通过以下几个步骤进行检查:

  1. 检查服务单元文件是否存在
    • 首先,检查系统中是否存在 Systemd 风格的服务单元文件。通常,这些文件位于 /etc/systemd/system//lib/systemd/system/ 目录下。你可以通过以下命令查找 Redis 的 Systemd 单元文件:
sudo find /etc/systemd/system /lib/systemd/system -name '*redis*'
    • 如果找到相关的 .service 文件,如 redis.service,则表明 Redis 已经配置为由 Systemd 管理。
  1. 检查 SysVinit 脚本
    • 接着,检查 /etc/init.d/ 目录下是否有 Redis 的服务脚本。例如:
ls /etc/init.d/ | grep redis
    • 如果这里找到了如 redis 的脚本,这表明 Redis 可能配置为使用 SysVinit 风格的服务管理。
  1. 查看服务链接
    • 有些系统会通过符号链接的方式将服务链接到 /etc/rc?.d/ 目录下,这是 SysVinit 时代的做法。可以通过以下命令检查:
find /etc/rc?.d/ -lname '*redis*'
    • 存在链接表明 Redis 可能使用 SysVinit 管理方式。
  1. 尝试使用命令
    • 尝试使用 systemctl 查询 Redis 服务状态,如果返回有效信息,则说明 Redis 服务是 Systemd 管理的:
systemctl status redis
    • 如果上述命令未找到服务,尝试使用 service 命令:
service redis status
    • 如果 service 命令成功显示状态,表明 Redis 可能是 SysVinit 风格的服务。

综合以上步骤,你可以确定 Redis 服务是使用 SysVinit 风格还是 Systemd 管理。在实际操作中,最直接的方法通常是直接使用命令行工具尝试管理服务,看哪个能成功响应。