systemctl命令

systemctl 命令 #

systemctl是一个用于控制systemd系统和服务管理器的命令行工具。它是现代Linux系统中管理系统服务、检查系统状态和管理系统的主要工具。

语法 #

systemctl [选项] 命令 [单元]

常用命令 #

命令 描述
start 启动一个或多个单元
stop 停止一个或多个单元
restart 重启一个或多个单元
reload 重新加载配置
status 显示单元状态
enable 设置单元在启动时自动启动
disable 禁止单元在启动时自动启动
is-active 检查单元是否处于活动状态
is-enabled 检查单元是否已启用
is-failed 检查单元是否处于失败状态
list-units 列出已加载的单元
list-unit-files 列出已安装的单元文件
daemon-reload 重新加载systemd管理器配置
reboot 重启系统
poweroff 关闭系统
suspend 挂起系统
hibernate 休眠系统
hybrid-sleep 混合休眠系统

常用选项 #

选项 描述
--user 与用户实例通信,而不是系统实例
--system 与系统实例通信(默认)
--failed 列出失败的单元
--all 显示所有加载的单元/单元文件(包括非活动单元)
--full 不截断输出
--no-pager 不将输出通过分页器传递
--no-legend 不打印标题和页脚
--no-wall 不发送wall消息
--quiet 抑制输出
-t, --type= 列出指定类型的单元
-p, --property= 显示指定属性
-H, --host= 在远程主机上操作

单元类型 #

systemd管理的单元类型包括:

  • .service:系统服务
  • .socket:进程间通信套接字
  • .device:硬件设备
  • .mount:文件系统挂载点
  • .automount:自动挂载点
  • .swap:交换分区
  • .target:一组单元
  • .path:文件系统路径
  • .timer:定时器
  • .slice:资源控制组
  • .scope:外部创建的进程

常见用法 #

1. 管理服务 #

启动服务 #

sudo systemctl start nginx.service

停止服务 #

sudo systemctl stop nginx.service

重启服务 #

sudo systemctl restart nginx.service

重新加载服务配置 #

sudo systemctl reload nginx.service

检查服务状态 #

systemctl status nginx.service

2. 启动时自动启动服务 #

启用服务自动启动 #

sudo systemctl enable nginx.service

禁用服务自动启动 #

sudo systemctl disable nginx.service

检查服务是否已启用 #

systemctl is-enabled nginx.service

3. 查看系统状态 #

检查系统状态 #

systemctl status

列出所有运行中的服务 #

systemctl list-units --type=service --state=running

列出所有失败的单元 #

systemctl --failed

列出所有服务 #

systemctl list-units --type=service --all

4. 管理系统 #

重启系统 #

sudo systemctl reboot

关闭系统 #

sudo systemctl poweroff

挂起系统 #

sudo systemctl suspend

休眠系统 #

sudo systemctl hibernate

5. 查看单元文件 #

列出所有已安装的单元文件 #

systemctl list-unit-files

查看特定单元文件的内容 #

systemctl cat nginx.service

显示单元的依赖关系 #

systemctl list-dependencies nginx.service

6. 管理systemd配置 #

重新加载systemd配置 #

sudo systemctl daemon-reload

重置失败的单元 #

sudo systemctl reset-failed

实用示例 #

1. 创建自定义服务 #

创建一个服务文件:

sudo nano /etc/systemd/system/myapp.service

添加以下内容:

[Unit]
Description=My Custom Application
After=network.target

[Service]
Type=simple
User=myuser
WorkingDirectory=/opt/myapp
ExecStart=/usr/bin/python3 /opt/myapp/app.py
Restart=on-failure

[Install]
WantedBy=multi-user.target

然后启用并启动服务:

sudo systemctl daemon-reload
sudo systemctl enable myapp.service
sudo systemctl start myapp.service

2. 查看服务日志 #

journalctl -u nginx.service

查看最近的日志:

journalctl -u nginx.service -n 50

实时查看日志:

journalctl -u nginx.service -f

3. 分析启动时间 #

systemd-analyze

查看每个服务的启动时间:

systemd-analyze blame

4. 管理系统资源限制 #

编辑服务文件添加资源限制:

sudo systemctl edit nginx.service

添加以下内容:

[Service]
CPUQuota=50%
MemoryLimit=1G

然后重启服务:

sudo systemctl daemon-reload
sudo systemctl restart nginx.service

5. 在远程主机上执行命令 #

systemctl -H user@remote-host status nginx.service

systemd单元文件结构 #

systemd单元文件通常包含以下几个部分:

[Unit] 部分 #

包含描述、文档和依赖关系等信息。

[Unit]
Description=描述
Documentation=手册页或URL
After=依赖的单元
Requires=必需的单元
Wants=可选的单元
Conflicts=冲突的单元

[Service] 部分(仅适用于服务单元) #

定义服务的行为。

[Service]
Type=服务类型(simple、forking、oneshot、notify、dbus、idle)
ExecStart=启动命令
ExecStop=停止命令
ExecReload=重载命令
Restart=重启条件(always、on-success、on-failure、on-abnormal、on-abort、on-watchdog)
RestartSec=重启前等待的秒数
User=运行服务的用户
Group=运行服务的组
WorkingDirectory=工作目录
Environment=环境变量

[Install] 部分 #

定义如何安装此单元。

[Install]
WantedBy=目标单元
RequiredBy=需要此单元的单元
Also=同时启用的其他单元
Alias=此单元的别名

与传统服务管理的比较 #

功能 systemd (systemctl) SysVinit (service) Upstart (initctl)
启动服务 systemctl start service start initctl start
停止服务 systemctl stop service stop initctl stop
重启服务 systemctl restart service restart initctl restart
启用自动启动 systemctl enable chkconfig on 编辑配置文件
并行启动 支持 不支持 部分支持
依赖管理 自动 手动 部分自动
资源控制 内置支持 不支持 不支持
日志管理 集成(journald) 分散 分散

提示 #

  • 使用systemctl status命令可以快速了解系统状态和问题
  • 服务名称后的.service后缀通常可以省略
  • 使用systemctl list-dependencies可以查看服务的依赖关系
  • 使用systemctl edit可以创建服务的覆盖配置,而不是直接修改原始文件
  • 使用journalctl -u service-name.service可以查看特定服务的日志
  • 在创建自定义服务时,确保设置适当的AfterWants依赖关系
  • 使用systemctl mask可以完全禁止启动某个服务
  • 使用systemctl --user可以管理用户级别的服务,无需root权限