systemd

$npx mdskill add TerminalSkills/skills/systemd

Manage Linux services with systemd unit files and commands

  • Create and manage system services, timers, and dependencies
  • Uses systemd APIs and standard Linux command-line tools
  • Analyzes service requirements from user input and system state
  • Generates unit files and executes systemctl commands directly
SKILL.md
.github/skills/systemdView on GitHub ↗
---
name: systemd
description: >-
  Manage Linux services with systemd. Use when a user asks to create a system
  service, run an app on boot, manage background processes, set up timers
  (cron replacement), or configure service dependencies and auto-restart.
license: Apache-2.0
compatibility: 'Linux (systemd-based: Ubuntu, Debian, CentOS, Fedora, Arch)'
metadata:
  author: terminal-skills
  version: 1.0.0
  category: devops
  tags:
    - systemd
    - linux
    - services
    - daemon
    - process-management
---

# systemd

## Overview

systemd manages Linux services — start, stop, restart, enable on boot, and monitor processes. It replaces init scripts with declarative unit files. Handles dependencies, auto-restart, logging (journald), resource limits, and timers (cron replacement).

## Instructions

### Step 1: Create a Service

```ini
# /etc/systemd/system/myapp.service — Node.js app as a system service
[Unit]
Description=My Node.js Application
After=network.target postgresql.service
Wants=postgresql.service

[Service]
Type=simple
User=deploy
Group=deploy
WorkingDirectory=/opt/myapp
ExecStart=/usr/bin/node dist/server.js
Restart=always
RestartSec=5
Environment=NODE_ENV=production
Environment=PORT=3000
EnvironmentFile=/opt/myapp/.env

# Security hardening
NoNewPrivileges=true
ProtectSystem=strict
ProtectHome=true
ReadWritePaths=/opt/myapp/uploads

# Resource limits
MemoryMax=512M
CPUQuota=80%

[Install]
WantedBy=multi-user.target
```

### Step 2: Manage Service

```bash
sudo systemctl daemon-reload          # reload after editing unit files
sudo systemctl enable myapp            # start on boot
sudo systemctl start myapp             # start now
sudo systemctl status myapp            # check status
sudo systemctl restart myapp           # restart
sudo systemctl stop myapp              # stop
journalctl -u myapp -f                 # view live logs
journalctl -u myapp --since "1 hour ago"  # recent logs
```

### Step 3: Timer (Cron Replacement)

```ini
# /etc/systemd/system/backup.timer — Run backup daily at 3 AM
[Unit]
Description=Daily Backup Timer

[Timer]
OnCalendar=*-*-* 03:00:00
Persistent=true

[Install]
WantedBy=timers.target
```

```ini
# /etc/systemd/system/backup.service — The actual backup job
[Unit]
Description=Database Backup

[Service]
Type=oneshot
User=deploy
ExecStart=/opt/scripts/backup.sh
```

```bash
sudo systemctl enable --now backup.timer
systemctl list-timers                    # list active timers
```

## Guidelines

- Always run `daemon-reload` after changing unit files.
- Use `Restart=always` for production services — systemd auto-restarts on crash.
- `journalctl -u service -f` is the primary log viewer — replaces checking log files.
- Timers are better than cron: persistent (catch up missed runs), dependency-aware, logged.
More from TerminalSkills/skills