0

0

Linux服务管理systemctl命令详解

P粉602998670

P粉602998670

发布时间:2025-09-16 15:41:01

|

719人浏览过

|

来源于php中文网

原创

systemctl是管理systemd服务的核心工具,通过操作单元(unit)实现服务的启动、停止、重启、状态查看及开机自启等控制,支持依赖管理、并发启动、Cgroups资源隔离和统一日志,相比SysVinit更高效稳定,并可通过编写.service文件自定义服务,结合journalctl调试,实现精细化系统管理。

linux服务管理systemctl命令详解

systemctl
是现代 Linux 系统中管理
systemd
服务的主要工具,它允许你高效地控制、监控和配置系统进程,相较于传统的
SysVinit
Upstart
,它提供了更强大、更细致的服务管理能力,是系统管理员日常操作不可或缺的命令。

解决方案

掌握

systemctl
的核心在于理解其对“单元(unit)”的操作。每个服务、挂载点、设备、套接字或定时任务在
systemd
中都被视为一个单元。以下是
systemctl
最常用的一些操作:

  • 启动服务:
    systemctl start 
    • 例如:
      systemctl start nginx
  • 停止服务:
    systemctl stop 
    • 例如:
      systemctl stop apache2
  • 重启服务:
    systemctl restart 
    • 当服务配置更改后,通常需要重启。
    • 例如:
      systemctl restart sshd
  • 重新加载服务配置:
    systemctl reload 
    • 某些服务支持在不中断当前连接的情况下重新加载配置,这比重启更平滑。
    • 例如:
      systemctl reload nginx
  • 查看服务状态:
    systemctl status 
    • 这是诊断问题最常用的命令,它会显示服务是否正在运行、最近的日志输出以及其他有用的信息。
    • 例如:
      systemctl status mysql
  • 开机自启服务:
    systemctl enable 
    • 这会创建一个符号链接,确保服务在系统启动时自动启动。
    • 例如:
      systemctl enable docker
  • 禁止开机自启服务:
    systemctl disable 
    • 移除开机自启的符号链接。
    • 例如:
      systemctl disable firewalld
  • 检查服务是否开机自启:
    systemctl is-enabled 
    • 例如:
      systemctl is-enabled crond
  • 屏蔽服务:
    systemctl mask 
    • 这会创建一个指向
      /dev/null
      的符号链接,阻止服务被启动,即使有其他服务依赖它或尝试手动启动它。这是禁用服务最强硬的方式。
    • 例如:
      systemctl mask cups
  • 解除屏蔽服务:
    systemctl unmask 
    • 例如:
      systemctl unmask cups
  • 列出所有正在运行的单元:
    systemctl list-units
  • 列出所有单元文件:
    systemctl list-unit-files
    • 这会显示所有已安装的单元文件及其启用状态(enabled, disabled, static, masked)。

systemctl
与传统服务管理命令有何不同?为何选择
systemd

SysVinit
systemd
的转变,对于许多老派的 Linux 管理员来说,无疑是一场不小的冲击,甚至可以说是一次思维模式的重塑。我个人在刚接触
systemd
时,也曾对那些散落在
/etc/init.d/
下的脚本和
chkconfig
命令感到一丝怀念。但随着深入使用,
systemd
的优势逐渐显现,让人不得不承认它的确是现代 Linux 服务管理的更优解。

最显著的不同体现在初始化过程的并行化

SysVinit
按照严格的顺序依次启动服务,一个服务卡住,整个启动链条就会停滞。而
systemd
凭借其基于依赖关系的并发启动能力,能大幅缩短系统启动时间。它能智能地识别服务间的依赖,并同时启动不相关的服务,这就像从单车道高速公路升级成了多车道,效率自然不可同日而语。

此外,

systemd
引入的 Cgroups 支持让资源管理变得更加精细。每个服务都在独立的 Cgroup 中运行,系统可以更好地隔离和限制服务的资源使用,防止某个失控的服务拖垮整个系统。这在以前,我们可能需要更复杂的配置或第三方工具才能实现。

另一个我非常欣赏的特性是它统一的日志管理。通过

journalctl
命令,我们可以集中查看所有服务的日志,而不是像以前那样需要在
/var/log
下的各种文件中翻找。结合
systemctl status
命令,快速定位服务问题变得异常高效。

systemd
还引入了按需启动(socket activation)定时任务(timers)等现代特性,让服务管理更加灵活和高效。例如,一个服务可以在有客户端请求时才启动,而不是一直占用资源;定时任务也比传统的
cron
更加强大和易于管理。

所以,选择

systemd
并非仅仅是追逐潮流,而是因为它提供了一个更健壮、更高效、更易于管理和调试的系统初始化和服务管理框架。虽然学习曲线可能存在,但长远来看,它无疑提升了系统的可靠性和运维效率。

如何编写和调试自定义
systemd
服务单元文件?

有时候,系统自带的服务无法满足我们的需求,或者我们需要运行一个自定义的应用程序作为后台服务。这时,编写自己的

systemd
单元文件就显得尤为重要。这听起来可能有点复杂,但只要掌握了基本结构,它其实相当直观。

一个典型的

.service
单元文件通常包含三个主要部分:
[Unit]
[Service]
[Install]
。我会把这些自定义的服务文件放在
/etc/systemd/system/
目录下,因为这个位置的优先级最高,而且不会被系统更新覆盖。

  • [Unit]
    部分: 描述单元的通用信息。

    • Description
      : 对服务的简短描述,这会显示在
      systemctl status
      的输出中。
    • After
      : 指定此服务应该在哪些服务之后启动。例如,如果你的应用需要网络,可以写
      After=network.target
    • Wants
      Requires
      : 定义依赖关系。
      Wants
      意味着“希望”依赖的服务启动,即使依赖的服务失败,当前服务也尝试启动;
      Requires
      则是“必须”依赖的服务启动,否则当前服务不会启动。
  • [Service]
    部分: 定义服务的具体行为。这是核心部分。

    Faceswap
    Faceswap

    免费开源的AI换脸工具

    下载
    • Type
      : 服务启动类型。常见的有
      simple
      (默认,
      ExecStart
      命令是主进程)、
      forking
      ExecStart
      命令会 fork 出子进程然后父进程退出)、
      oneshot
      (只执行一次命令,完成后退出)、
      notify
      (服务会发送信号通知
      systemd
      启动完成)。
    • ExecStart
      : 启动服务时执行的命令。这是最重要的指令,通常包含你的应用程序或脚本的完整路径。
    • ExecStop
      : 停止服务时执行的命令(可选)。
    • ExecReload
      : 重新加载服务时执行的命令(可选)。
    • WorkingDirectory
      : 服务的工作目录。
    • User
      Group
      : 指定服务运行的用户和组,这对于安全非常重要。
    • Restart
      : 定义服务在何种情况下自动重启。例如
      on-failure
      (失败时重启)、
      always
      (总是重启)。
    • Environment
      : 为服务设置环境变量
  • [Install]
    部分: 定义服务如何安装(即如何被
    enable
    )。

    • WantedBy
      : 当服务被
      enable
      时,它会被添加到哪个目标(target)中。例如,
      WantedBy=multi-user.target
      意味着在多用户模式下启动。

调试技巧: 编写完单元文件后,首先要做的不是直接启动,而是:

  1. 重新加载
    systemd
    配置:
    sudo systemctl daemon-reload
    。这一步至关重要,
    systemd
    不会自动检测文件变化。
  2. 验证单元文件:
    sudo systemd-analyze verify /etc/systemd/system/your-service.service
    。这可以检查语法错误。
  3. 启动服务并检查状态:
    sudo systemctl start your-service && sudo systemctl status your-service
  4. 查看详细日志:
    journalctl -u your-service.service -f
    -f
    选项会实时跟踪日志,这对于排查启动失败或运行时错误极其有用。我会盯着这个输出,看我的
    ExecStart
    命令到底执行了什么,以及有没有报错。
  5. 检查进程:
    ps aux | grep your-service
    确认进程是否真的在运行。

我个人的经验是,

ExecStart
路径问题、权限问题以及环境变量配置不当是新手最常遇到的坑。务必使用绝对路径,并确保服务运行用户有足够的权限访问所需文件。

掌握
systemctl
常用命令及高级技巧有哪些?

除了日常的启动、停止和状态查询,

systemctl
还有一些命令和技巧能让你对系统有更深的掌控。这些“高级”操作并非遥不可及,而是日常运维中解决复杂问题的利器。

  • 查看单元文件的实际内容:

    systemctl cat 

    • 这个命令会直接显示
      systemd
      实际加载的单元文件内容,包括所有覆盖(override)和片段(drop-in)文件。当你在
      /etc/systemd/system/.d/
      目录下创建了额外的配置片段时,这个命令尤其有用,它能让你看清最终生效的配置是什么样子。
  • 显示单元的所有属性:

    systemctl show 

    • 这会列出服务的所有配置属性,包括那些默认值。对于理解服务的详细行为,比如
      RestartSec
      TimeoutStartSec
      等,非常有帮助。
  • 检查单元的活动状态:

    • systemctl is-active 
      :如果服务正在运行,返回
      active
    • systemctl is-enabled 
      :如果服务已启用开机自启,返回
      enabled
    • systemctl is-failed 
      :如果服务处于失败状态,返回
      failed
    • 这些命令在脚本中进行条件判断时非常方便。
  • 管理

    systemd
    目标(Targets):

    • systemd
      引入了“目标”的概念,它们类似于
      SysVinit
      中的运行级别(runlevels)。例如,
      multi-user.target
      对应多用户命令行模式,
      graphical.target
      对应图形界面模式。
    • systemctl get-default
      :查看默认启动目标。
    • systemctl set-default multi-user.target
      :将默认启动目标设置为多用户命令行模式。
    • systemctl isolate graphical.target
      :切换到图形界面模式(会停止不属于该目标的服务)。这个命令在排查图形界面问题时,可以尝试切换回命令行模式。
  • 使用

    systemctl --user
    管理用户级服务:

    • 除了系统服务,
      systemd
      也支持用户级别的服务。这些服务在用户登录后启动,并在用户退出时停止,无需 root 权限。
    • systemctl --user start 
    • systemctl --user enable 
    • 这对于运行一些个人应用或后台脚本非常方便,比如我有时会用它来管理一个自定义的本地开发服务器,避免污染系统服务。
  • 创建临时服务:

    systemctl start --transient 

    • 这个命令可以在不创建单元文件的情况下,临时启动一个服务。它会在系统重启后消失,适合进行一些一次性测试。

这些技巧能让你在日常管理和故障排除中更加游刃有余。深入理解

systemd
的设计哲学和
systemctl
的各种功能,会让你在 Linux 的世界里走得更远,解决问题也更得心应手。

相关专题

更多
mysql修改数据表名
mysql修改数据表名

MySQL修改数据表:1、首先查看数据库中所有的表,代码为:‘SHOW TABLES;’;2、修改表名,代码为:‘ALTER TABLE 旧表名 RENAME [TO] 新表名;’。php中文网还提供MySQL的相关下载、相关课程等内容,供大家免费下载使用。

664

2023.06.20

MySQL创建存储过程
MySQL创建存储过程

存储程序可以分为存储过程和函数,MySQL中创建存储过程和函数使用的语句分别为CREATE PROCEDURE和CREATE FUNCTION。使用CALL语句调用存储过程智能用输出变量返回值。函数可以从语句外调用(通过引用函数名),也能返回标量值。存储过程也可以调用其他存储过程。php中文网还提供MySQL创建存储过程的相关下载、相关课程等内容,供大家免费下载使用。

246

2023.06.21

mongodb和mysql的区别
mongodb和mysql的区别

mongodb和mysql的区别:1、数据模型;2、查询语言;3、扩展性和性能;4、可靠性。本专题为大家提供mongodb和mysql的区别的相关的文章、下载、课程内容,供大家免费下载体验。

281

2023.07.18

mysql密码忘了怎么查看
mysql密码忘了怎么查看

MySQL是一个关系型数据库管理系统,由瑞典MySQL AB 公司开发,属于 Oracle 旗下产品。MySQL 是最流行的关系型数据库管理系统之一,在 WEB 应用方面,MySQL是最好的 RDBMS 应用软件之一。那么mysql密码忘了怎么办呢?php中文网给大家带来了相关的教程以及文章,欢迎大家前来阅读学习。

514

2023.07.19

mysql创建数据库
mysql创建数据库

MySQL是一个关系型数据库管理系统,由瑞典MySQL AB 公司开发,属于 Oracle 旗下产品。MySQL 是最流行的关系型数据库管理系统之一,在 WEB 应用方面,MySQL是最好的 RDBMS 应用软件之一。那么mysql怎么创建数据库呢?php中文网给大家带来了相关的教程以及文章,欢迎大家前来阅读学习。

253

2023.07.25

mysql默认事务隔离级别
mysql默认事务隔离级别

MySQL是一种广泛使用的关系型数据库管理系统,它支持事务处理。事务是一组数据库操作,它们作为一个逻辑单元被一起执行。为了保证事务的一致性和隔离性,MySQL提供了不同的事务隔离级别。php中文网给大家带来了相关的教程以及文章欢迎大家前来学习阅读。

386

2023.08.08

sqlserver和mysql区别
sqlserver和mysql区别

SQL Server和MySQL是两种广泛使用的关系型数据库管理系统。它们具有相似的功能和用途,但在某些方面存在一些显著的区别。php中文网给大家带来了相关的教程以及文章,欢迎大家前来学习阅读。

529

2023.08.11

mysql忘记密码
mysql忘记密码

MySQL是一种关系型数据库管理系统,关系数据库将数据保存在不同的表中,而不是将所有数据放在一个大仓库内,这样就增加了速度并提高了灵活性。那么忘记mysql密码我们该怎么解决呢?php中文网给大家带来了相关的教程以及其他关于mysql的文章,欢迎大家前来学习阅读。

599

2023.08.14

Java JVM 原理与性能调优实战
Java JVM 原理与性能调优实战

本专题系统讲解 Java 虚拟机(JVM)的核心工作原理与性能调优方法,包括 JVM 内存结构、对象创建与回收流程、垃圾回收器(Serial、CMS、G1、ZGC)对比分析、常见内存泄漏与性能瓶颈排查,以及 JVM 参数调优与监控工具(jstat、jmap、jvisualvm)的实战使用。通过真实案例,帮助学习者掌握 Java 应用在生产环境中的性能分析与优化能力。

3

2026.01.20

热门下载

更多
网站特效
/
网站源码
/
网站素材
/
前端模板

精品课程

更多
相关推荐
/
热门推荐
/
最新课程
MySQL 教程
MySQL 教程

共48课时 | 1.8万人学习

MySQL 初学入门(mosh老师)
MySQL 初学入门(mosh老师)

共3课时 | 0.3万人学习

简单聊聊mysql8与网络通信
简单聊聊mysql8与网络通信

共1课时 | 801人学习

关于我们 免责申明 举报中心 意见反馈 讲师合作 广告合作 最新更新
php中文网:公益在线php培训,帮助PHP学习者快速成长!
关注服务号 技术交流群
PHP中文网订阅号
每天精选资源文章推送

Copyright 2014-2026 https://www.php.cn/ All Rights Reserved | php.cn | 湘ICP备2023035733号