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
可以查看特定服务的日志 - 在创建自定义服务时,确保设置适当的
After
和Wants
依赖关系 - 使用
systemctl mask
可以完全禁止启动某个服务 - 使用
systemctl --user
可以管理用户级别的服务,无需root权限