0Pricing
Linux Command Line & Bash Scripting Mastery · Lezione

Controllare i servizi systemd e scrivere file unit

Gestisca i servizi con systemctl e crei file unit e timer personalizzati per demoni gestiti da script.

Controllare i servizi systemd e scrivere file unit è una lezione Linux Command Line & Bash Scripting Mastery gratuita su CoddyKit. Questa è la lezione 2 di 4. Puoi leggere la lezione completa qui gratuitamente — poi esercitati direttamente nel browser con un editor di codice integrato e un tutor IA disponibile 24/7. Fa parte del percorso di apprendimento Linux Command Line & Bash Scripting Mastery, e i tuoi progressi si sincronizzano tra il web e l'app CoddyKit. Il corso Linux Command Line & Bash Scripting Mastery include 4 lezioni in totale.

Introduzione a systemd e systemctl

systemd è il sistema init e il gestore dei servizi utilizzato dalla maggior parte delle moderne distribuzioni Linux. È responsabile dell'avvio, dell'arresto e della gestione dei servizi di sistema, oltre che della sequenza di boot e dello stato del sistema.

Lo strumento principale per interagire con systemd è systemctl. Con questo strumento può:

  • Avviare e arrestare i servizi
  • Abilitare o disabilitare i servizi all'avvio
  • Esaminare lo stato e i log dei servizi
  • Ricaricare la configurazione senza riavviare

Tutti i servizi gestiti da systemd sono definiti da file unit, ovvero file di configurazione dichiarativi memorizzati in /etc/systemd/system/ (a livello di sistema) o ~/.config/systemd/user/ (per singolo utente).

Comandi essenziali di systemctl

Questi sono i comandi systemctl più utilizzati per la gestione quotidiana dei servizi. Ogni comando opera su un nome di unità, come nginx.service o semplicemente nginx.

  • systemctl start <unit> — avvia immediatamente un servizio
  • systemctl stop <unit> — arresta un servizio in esecuzione
  • systemctl restart <unit> — arresta e riavvia il servizio (riavvio completo)
  • systemctl reload <unit> — invia SIGHUP per ricaricare la configurazione senza arrestare il servizio
  • systemctl enable <unit> — crea collegamenti simbolici affinché l'unità venga avviata all'avvio del sistema
  • systemctl disable <unit> — rimuove tali collegamenti simbolici
  • systemctl status <unit> — mostra lo stato, il PID e le righe di log recenti
#!/usr/bin/env bash
# Quick reference: inspect and control an nginx service
# (Requires nginx to be installed; run as root or with sudo)

systemctl status nginx
systemctl start nginx
systemctl enable nginx
systemctl reload nginx
systemctl restart nginx
systemctl stop nginx
systemctl disable nginx

Verifica dettagliata dello stato di un servizio

systemctl status fornisce un riepilogo dettagliato di un'unità. Comprenderne l'output è essenziale per diagnosticare rapidamente i problemi.

  • Loaded: percorso del file dell'unità e indicazione dell'eventuale abilitazione all'avvio
  • Active: stato corrente — active (running), inactive (dead), failed
  • Main PID: identificatore del processo principale del servizio
  • CGroup: tutti i processi figlio appartenenti al servizio
  • Log lines: le voci più recenti del journal relative a questa unità

È inoltre possibile interrogare solo lo stato di attivazione con systemctl is-active e lo stato di abilitazione con systemctl is-enabled; questi comandi sono ideali per l'uso negli script.

#!/usr/bin/env bash
# Script-friendly service health check
SERVICE="sshd"

if systemctl is-active --quiet "$SERVICE"; then
    echo "$SERVICE is running."
else
    echo "$SERVICE is NOT running. Attempting restart..."
    systemctl restart "$SERVICE"
fi

if systemctl is-enabled --quiet "$SERVICE"; then
    echo "$SERVICE is enabled at boot."
else
    echo "WARNING: $SERVICE is not enabled at boot."
fi

Elenco e filtraggio delle unità

Quando si gestiscono molti servizi, sono necessari metodi efficienti per elencare e filtrare le unità. systemctl list-units mostra tutte le unità attualmente caricate, mentre list-unit-files mostra tutti i file delle unità installati e il relativo stato di abilitazione.

Opzioni di filtraggio utili:

  • --type=service — mostra solo le unità di servizio
  • --state=failed — mostra solo le unità in errore
  • --state=active — mostra solo le unità attive
  • --all — include nell'elenco anche le unità inattive

Combinando questi filtri con grep è possibile creare pipeline di ispezione potenti negli script di manutenzione.

#!/usr/bin/env bash
# List all failed services and report them
echo "=== Failed Services ==="
systemctl list-units --type=service --state=failed --no-legend

echo ""
echo "=== Services Enabled at Boot ==="
systemctl list-unit-files --type=service --state=enabled --no-legend | awk '{print $1}'

Struttura di un file di unità di servizio systemd

Un file di unità di servizio è un file di testo semplice in stile INI, composto da sezioni. Ogni sezione controlla un aspetto diverso del ciclo di vita dell'unità.

  • [Unit] — metadati: descrizione e dipendenze per l'ordinamento (After=, Requires=, Wants=)
  • [Service] — modalità di avvio e arresto del processo: ExecStart, ExecStop, Restart, User, WorkingDirectory
  • [Install] — quando l'unità deve essere abilitata: WantedBy=multi-user.target indica che viene attivata durante il normale avvio multiutente

Dopo aver inserito o modificato un file di unità in /etc/systemd/system/, è necessario eseguire systemctl daemon-reload affinché systemd acquisisca le modifiche.

Scrittura del primo file di unità di servizio

Creiamo un semplice file di unità di servizio per uno script personalizzato di un server HTTP Python. Il file di unità indica a systemd esattamente come gestire questo processo, come se fosse un qualsiasi altro servizio di sistema.

Direttive [Service] principali utilizzate in questo esempio:

  • Type=simple — systemd considera il processo ExecStart come processo principale
  • User=www-data — esegue il processo con un account non root per motivi di sicurezza
  • WorkingDirectory — imposta la directory di lavoro del processo
  • Restart=on-failure — riavvia automaticamente il processo se termina con un codice diverso da zero
  • RestartSec=5 — attende 5 secondi tra un tentativo di riavvio e l'altro
#!/usr/bin/env bash
# Create a custom service unit file for a simple HTTP server
# Run as root

cat > /etc/systemd/system/mywebserver.service << 'EOF'
[Unit]
Description=My Custom Python Web Server
After=network.target

[Service]
Type=simple
User=www-data
WorkingDirectory=/var/www/mysite
ExecStart=/usr/bin/python3 -m http.server 8080
Restart=on-failure
RestartSec=5
StandardOutput=journal
StandardError=journal

[Install]
WantedBy=multi-user.target
EOF

systemctl daemon-reload
systemctl enable --now mywebserver.service
systemctl status mywebserver.service

Tipi di servizio e ciclo di vita dei processi

La direttiva Type= nella sezione [Service] indica a systemd come determinare quando un servizio ha completato l'avvio. La scelta del tipo errato è una causa comune di problemi nell'ordinamento.

  • Type=simple — predefinito; systemd considera avviato il servizio non appena viene lanciato ExecStart. Non è necessario alcun segnale di disponibilità.
  • Type=forking — il processo ExecStart crea un fork e termina; il demone reale viene eseguito come processo figlio. Utilizzare PIDFile= affinché systemd possa monitorarlo.
  • Type=notify — il processo invia sd_notify(READY=1) quando è effettivamente pronto. È il tipo più affidabile per i demoni complessi.
  • Type=oneshot — viene eseguito una volta e termina; le unità successive attendono il completamento. È ideale per gli script di configurazione.
  • Type=idle — simile a simple, ma l'esecuzione viene ritardata finché non terminano tutti i job attivi.
#!/usr/bin/env bash
# Example: oneshot service for a database migration script
# /etc/systemd/system/db-migrate.service

cat > /etc/systemd/system/db-migrate.service << 'EOF'
[Unit]
Description=Run Database Migrations
After=postgresql.service
Requires=postgresql.service

[Service]
Type=oneshot
User=appuser
WorkingDirectory=/opt/myapp
ExecStart=/opt/myapp/scripts/migrate.sh
RemainAfterExit=yes

[Install]
WantedBy=multi-user.target
EOF

systemctl daemon-reload
systemctl start db-migrate.service

Variabili d'ambiente e rafforzamento della sicurezza

I file delle unità di servizio supportano diverse direttive per passare variabili d'ambiente e applicare restrizioni di sicurezza: entrambi gli aspetti sono importanti nei sistemi di produzione.

Direttive per l'ambiente:

  • Environment="KEY=value" — imposta una singola variabile direttamente nella configurazione
  • EnvironmentFile=/etc/myapp/env — carica le variabili da un file (una KEY=value per riga)

Direttive comuni per il rafforzamento della sicurezza:

  • NoNewPrivileges=true — impedisce al processo di acquisire privilegi aggiuntivi tramite setuid
  • ProtectSystem=strict — monta /usr, /boot e /etc in sola lettura
  • PrivateTmp=true — assegna al servizio una directory /tmp isolata e privata
  • CapabilityBoundingSet= — elimina tutte le capability Linux
#!/usr/bin/env bash
# Hardened service unit with environment file

cat > /etc/systemd/system/secureapp.service << 'EOF'
[Unit]
Description=Secure Application Daemon
After=network.target

[Service]
Type=simple
User=secureapp
Group=secureapp
WorkingDirectory=/opt/secureapp
EnvironmentFile=/etc/secureapp/env
ExecStart=/opt/secureapp/bin/server
Restart=on-failure
RestartSec=10

# Security hardening
NoNewPrivileges=true
ProtectSystem=strict
ProtectHome=true
PrivateTmp=true
CapabilityBoundingSet=
ReadWritePaths=/var/lib/secureapp /var/log/secureapp

[Install]
WantedBy=multi-user.target
EOF

# Create the environment file separately so secrets stay out of the unit file
install -m 600 -o secureapp /dev/null /etc/secureapp/env
echo 'APP_PORT=9000' >> /etc/secureapp/env
echo 'DB_URL=postgresql://localhost/mydb' >> /etc/secureapp/env

systemctl daemon-reload

Introduzione alle unità timer di systemd

Un timer systemd è un'unità che attiva un'altra unità (solitamente un .service) secondo una pianificazione. Sostituisce i tradizionali job cron con un meccanismo più integrato, dotato di log e controllabile.

Ogni unità timer (foo.timer) è associata a un'unità di servizio con lo stesso nome di base (foo.service), che esegue effettivamente il lavoro. È necessario abilitare e avviare il timer, non il servizio direttamente.

Tipi di timer:

  • Timer in tempo reale (da calendario) — si attivano a orari prestabiliti utilizzando espressioni OnCalendar= come daily, weekly o Mon *-*-* 02:00:00
  • Timer monotoni — si attivano in relazione a un evento di sistema utilizzando OnBootSec=, OnActiveSec= o OnUnitActiveSec=

Scrittura di un file di unità timer

Creiamo una coppia completa timer + servizio che esegua ogni giorno alle 02:00 uno script di backup. Si noti che la sezione [Timer] si trova in un file .timer separato, mentre il lavoro viene eseguito nel file .service associato.

Direttive [Timer] principali:

  • OnCalendar= — espressione di calendario che definisce la pianificazione
  • Persistent=true — se il sistema era spento all'ora prevista, esegue il timer immediatamente al successivo avvio
  • RandomizedDelaySec= — aggiunge un ritardo casuale fino a N secondi per evitare l'effetto valanga quando molti host condividono la stessa pianificazione
  • Unit= — unità di destinazione esplicita (facoltativa se i nomi corrispondono)
#!/usr/bin/env bash
# Create a daily backup timer pair
# Run as root

# 1. The service that does the work
cat > /etc/systemd/system/daily-backup.service << 'EOF'
[Unit]
Description=Daily Database Backup
After=network.target postgresql.service

[Service]
Type=oneshot
User=backup
ExecStart=/usr/local/bin/backup-db.sh
StandardOutput=journal
StandardError=journal
EOF

# 2. The timer that schedules it
cat > /etc/systemd/system/daily-backup.timer << 'EOF'
[Unit]
Description=Run Daily Database Backup at 02:00

[Timer]
OnCalendar=*-*-* 02:00:00
Persistent=true
RandomizedDelaySec=300

[Install]
WantedBy=timers.target
EOF

systemctl daemon-reload
systemctl enable --now daily-backup.timer

# Verify
systemctl list-timers daily-backup.timer

Ispezione dei log e risoluzione dei problemi delle unità

systemd indirizza tutto l'output dei servizi al journal, che si interroga con journalctl. In questo modo i log di tutte le unità vengono centralizzati in un unico archivio consultabile.

Opzioni essenziali di journalctl per la risoluzione dei problemi dei servizi:

  • -u <unit> — filtra per nome dell'unità
  • -f — segue il log in tempo reale (come tail -f)
  • -n 50 — mostra solo le ultime 50 righe
  • --since "1 hour ago" — limita i risultati in base all'orario
  • -p err — mostra solo gli errori e le priorità superiori
  • -b — mostra solo i log dell'avvio corrente

Quando un'unità non riesce ad avviarsi, il primo comando da eseguire è journalctl -u <unit> -n 30 --no-pager, seguito da systemctl status <unit> per acquisire il contesto dell'errore recente.

#!/usr/bin/env bash
# Troubleshooting helper: dump unit status and recent logs
# Usage: ./service-debug.sh <unit-name>

UNIT="${1:-nginx.service}"

echo "=============================="
echo "STATUS: $UNIT"
echo "=============================="
systemctl status "$UNIT" --no-pager -l

echo ""
echo "=============================="
echo "RECENT LOGS (last 50 lines): $UNIT"
echo "=============================="
journalctl -u "$UNIT" -n 50 --no-pager

echo ""
echo "=============================="
echo "ERRORS ONLY (current boot)"
echo "=============================="
journalctl -u "$UNIT" -b -p err --no-pager

Verifica delle conoscenze: file delle unità systemd

Verifichi la Sua comprensione della configurazione delle unità di servizio e timer di systemd.

Riepilogo della lezione: controllo dei servizi systemd e scrittura dei file delle unità

In questa lezione ha esplorato i concetti fondamentali della gestione dei servizi systemd e della creazione di file delle unità a livello professionale. Ecco un riepilogo degli argomenti trattati:

  • Fondamenti di systemctl — start, stop, restart, reload, enable, disable, status, is-active e is-enabled per controlli adatti agli script
  • Elenco e filtraggio — list-units e list-unit-files con le opzioni --type e --state per isolare i servizi in errore o abilitati
  • Struttura dei file delle unità — le tre sezioni [Unit], [Service] e [Install] e le relative direttive principali
  • Tipi di servizio — simple, forking, notify, oneshot e quando utilizzare ciascuno di essi
  • Ambiente e sicurezza — EnvironmentFile, NoNewPrivileges, ProtectSystem e PrivateTmp per demoni rafforzati
  • Unità timer — associazione di file .timer e .service, espressioni OnCalendar e comportamento di recupero di Persistent
  • Journalctl — filtraggio per unità, orario, avvio e priorità per diagnosticare efficacemente i guasti

Con queste competenze può gestire qualsiasi servizio di sistema, pianificare in modo affidabile le attività ricorrenti e creare file delle unità pronti per la produzione per i Suoi demoni.

Domande Frequenti

La lezione «Controllare i servizi systemd e scrivere file unit» è gratuita?

Sì — il testo completo di «Controllare i servizi systemd e scrivere file unit» è gratuito qui sul web. Per esercitarvi in modo interattivo (un editor di codice integrato e un tutor IA 24/7) e sbloccare il resto del corso Linux Command Line & Bash Scripting Mastery, passa a CoddyKit PRO. Il corso Linux Command Line & Bash Scripting Mastery include 4 lezioni in totale.

Cosa imparerò in «Controllare i servizi systemd e scrivere file unit»?

Gestisca i servizi con systemctl e crei file unit e timer personalizzati per demoni gestiti da script. Eserciti Linux Command Line & Bash Scripting Mastery con codice pratico che esegui direttamente nel browser, e un tutor IA 24/7 risponde alle tue domande mentre lavori sulla lezione.

Ho bisogno di esperienza per iniziare Linux Command Line & Bash Scripting Mastery?

Non è richiesta alcuna esperienza precedente. Linux Command Line & Bash Scripting Mastery su CoddyKit è strutturato per principianti e studenti avanzati, quindi puoi iniziare da qui o dall'inizio e procedere al tuo ritmo. Questa è la lezione 2 di 4.

Quanto tempo richiede la lezione «Controllare i servizi systemd e scrivere file unit»?

La maggior parte delle lezioni CoddyKit richiede circa 5–10 minuti. Ogni lezione è breve e interattiva, quindi fai progressi costanti e riprendi esattamente da dove hai lasciato su web e app.

Posso scrivere ed eseguire codice in questa lezione Linux Command Line & Bash Scripting Mastery?

Sì. Ogni lezione Linux Command Line & Bash Scripting Mastery include un editor di codice integrato, quindi scrivi ed esegui codice reale direttamente nel tuo browser e ricevi feedback istantaneo dall'IA — nessuna configurazione locale necessaria.

Tutte le lezioni di questo corso

  1. Automatizzare la gestione di utenti e gruppi
  2. Controllare i servizi systemd e scrivere file unit
  3. Automatizzare dischi, filesystem e mount
  4. Creare script per controlli e avvisi sullo stato del sistema
← Torna a Linux Command Line & Bash Scripting Mastery