systemd

Systemd 服务单元编写、依赖管理、日志查看等技能。

Safety Notice

This listing is imported from skills.sh public index metadata. Review upstream SKILL.md and repository scripts before running.

Copy this and send it to your AI assistant to learn

Install skill "systemd" with this command: npx skills add chaterm/terminal-skills/chaterm-terminal-skills-systemd

Systemd 服务管理

概述

Systemd 服务单元编写、依赖管理、日志查看等技能。

服务管理

基础命令

启停服务

systemctl start service-name systemctl stop service-name systemctl restart service-name systemctl reload service-name # 重载配置(不中断服务)

开机启动

systemctl enable service-name systemctl disable service-name systemctl enable --now service-name # 启用并立即启动

查看状态

systemctl status service-name systemctl is-active service-name systemctl is-enabled service-name systemctl is-failed service-name

服务列表

列出所有服务

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

列出所有单元文件

systemctl list-unit-files --type=service

查看依赖

systemctl list-dependencies service-name systemctl list-dependencies --reverse service-name

单元文件

文件位置

系统单元(包管理器安装)

/usr/lib/systemd/system/

管理员自定义

/etc/systemd/system/

运行时生成

/run/systemd/system/

优先级:/etc > /run > /usr/lib

基础服务单元

/etc/systemd/system/myapp.service

[Unit] Description=My Application Documentation=https://example.com/docs After=network.target Wants=network-online.target

[Service] Type=simple User=appuser Group=appgroup WorkingDirectory=/opt/myapp ExecStart=/opt/myapp/bin/start.sh ExecStop=/opt/myapp/bin/stop.sh ExecReload=/bin/kill -HUP $MAINPID Restart=on-failure RestartSec=5

[Install] WantedBy=multi-user.target

服务类型

simple(默认)- 主进程即服务进程

Type=simple ExecStart=/usr/bin/myapp

forking - 传统守护进程

Type=forking PIDFile=/var/run/myapp.pid ExecStart=/usr/bin/myapp -d

oneshot - 一次性任务

Type=oneshot ExecStart=/usr/bin/backup.sh RemainAfterExit=yes

notify - 服务就绪通知

Type=notify ExecStart=/usr/bin/myapp

环境变量

[Service]

直接设置

Environment="VAR1=value1" "VAR2=value2"

从文件加载

EnvironmentFile=/etc/myapp/env EnvironmentFile=-/etc/myapp/env.local # - 表示可选

传递给子进程

PassEnvironment=HOME USER

资源限制

[Service]

文件描述符

LimitNOFILE=65535

进程数

LimitNPROC=4096

内存限制

MemoryLimit=512M MemoryMax=1G

CPU 限制

CPUQuota=50%

超时设置

TimeoutStartSec=30 TimeoutStopSec=30

安全选项

[Service]

用户隔离

User=appuser Group=appgroup DynamicUser=yes

文件系统保护

ProtectSystem=strict ProtectHome=yes ReadWritePaths=/var/lib/myapp

网络隔离

PrivateNetwork=yes

能力限制

CapabilityBoundingSet=CAP_NET_BIND_SERVICE AmbientCapabilities=CAP_NET_BIND_SERVICE NoNewPrivileges=yes

日志管理

journalctl

查看服务日志

journalctl -u service-name journalctl -u service-name -f # 实时跟踪 journalctl -u service-name --since today journalctl -u service-name --since "1 hour ago" journalctl -u service-name -n 100 # 最后100行

按时间范围

journalctl --since "2024-01-01" --until "2024-01-02"

按优先级

journalctl -p err # 错误及以上 journalctl -p warning

输出格式

journalctl -u service-name -o json journalctl -u service-name -o json-pretty

磁盘使用

journalctl --disk-usage journalctl --vacuum-size=500M # 清理到500M journalctl --vacuum-time=7d # 保留7天

定时器

Timer 单元

/etc/systemd/system/backup.timer

[Unit] Description=Daily Backup Timer

[Timer] OnCalendar=daily OnCalendar=--* 02:00:00 # 每天凌晨2点 Persistent=true # 错过的任务补执行

[Install] WantedBy=timers.target

/etc/systemd/system/backup.service

[Unit] Description=Backup Service

[Service] Type=oneshot ExecStart=/usr/local/bin/backup.sh

定时器管理

启用定时器

systemctl enable --now backup.timer

查看定时器

systemctl list-timers systemctl list-timers --all

常见场景

场景 1:Node.js 应用

[Unit] Description=Node.js Application After=network.target

[Service] Type=simple User=node WorkingDirectory=/opt/nodeapp ExecStart=/usr/bin/node /opt/nodeapp/app.js Restart=on-failure RestartSec=10 Environment=NODE_ENV=production Environment=PORT=3000

[Install] WantedBy=multi-user.target

场景 2:Java 应用

[Unit] Description=Java Application After=network.target

[Service] Type=simple User=java ExecStart=/usr/bin/java -Xms512m -Xmx1024m -jar /opt/app/app.jar SuccessExitStatus=143 Restart=on-failure RestartSec=10

[Install] WantedBy=multi-user.target

场景 3:覆盖系统服务配置

创建覆盖目录

systemctl edit nginx

或手动创建

mkdir -p /etc/systemd/system/nginx.service.d/ cat > /etc/systemd/system/nginx.service.d/override.conf << EOF [Service] LimitNOFILE=65535 EOF

systemctl daemon-reload systemctl restart nginx

故障排查

问题 排查方法

服务启动失败 systemctl status , journalctl -u

依赖问题 systemctl list-dependencies

配置错误 systemd-analyze verify service.service

权限问题 检查 User/Group、文件权限

超时 调整 TimeoutStartSec

重载配置

systemctl daemon-reload

分析启动时间

systemd-analyze systemd-analyze blame systemd-analyze critical-chain

验证单元文件

systemd-analyze verify /etc/systemd/system/myapp.service

Source Transparency

This detail page is rendered from real SKILL.md content. Trust labels are metadata-based hints, not a safety guarantee.

Related Skills

Related by shared tags or category signals.

General

cron

No summary provided by upstream source.

Repository SourceNeeds Review
General

system-admin

No summary provided by upstream source.

Repository SourceNeeds Review
General

network-tools

No summary provided by upstream source.

Repository SourceNeeds Review
General

ssh

No summary provided by upstream source.

Repository SourceNeeds Review