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 serviziosystemctl stop <unit>— arresta un servizio in esecuzionesystemctl restart <unit>— arresta e riavvia il servizio (riavvio completo)systemctl reload <unit>— invia SIGHUP per ricaricare la configurazione senza arrestare il serviziosystemctl enable <unit>— crea collegamenti simbolici affinché l'unità venga avviata all'avvio del sistemasystemctl disable <unit>— rimuove tali collegamenti simbolicisystemctl 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 nginxVerifica 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."
fiElenco 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.targetindica 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 processoExecStartcome processo principaleUser=www-data— esegue il processo con un account non root per motivi di sicurezzaWorkingDirectory— imposta la directory di lavoro del processoRestart=on-failure— riavvia automaticamente il processo se termina con un codice diverso da zeroRestartSec=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.serviceTipi 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 lanciatoExecStart. Non è necessario alcun segnale di disponibilità.Type=forking— il processoExecStartcrea un fork e termina; il demone reale viene eseguito come processo figlio. UtilizzarePIDFile=affinché systemd possa monitorarlo.Type=notify— il processo inviasd_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.serviceVariabili 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 configurazioneEnvironmentFile=/etc/myapp/env— carica le variabili da un file (unaKEY=valueper riga)
Direttive comuni per il rafforzamento della sicurezza:
NoNewPrivileges=true— impedisce al processo di acquisire privilegi aggiuntivi tramite setuidProtectSystem=strict— monta/usr,/boote/etcin sola letturaPrivateTmp=true— assegna al servizio una directory/tmpisolata e privataCapabilityBoundingSet=— 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-reloadIntroduzione 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=comedaily,weeklyoMon *-*-* 02:00:00 - Timer monotoni — si attivano in relazione a un evento di sistema utilizzando
OnBootSec=,OnActiveSec=oOnUnitActiveSec=
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 pianificazionePersistent=true— se il sistema era spento all'ora prevista, esegue il timer immediatamente al successivo avvioRandomizedDelaySec=— aggiunge un ritardo casuale fino a N secondi per evitare l'effetto valanga quando molti host condividono la stessa pianificazioneUnit=— 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.timerIspezione 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 (cometail -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-pagerVerifica 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-unitselist-unit-filescon le opzioni--typee--stateper 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,oneshote quando utilizzare ciascuno di essi - Ambiente e sicurezza —
EnvironmentFile,NoNewPrivileges,ProtectSystemePrivateTmpper demoni rafforzati - Unità timer — associazione di file
.timere.service, espressioniOnCalendare comportamento di recupero diPersistent - 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
- Automatizzare la gestione di utenti e gruppi
- Controllare i servizi systemd e scrivere file unit
- Automatizzare dischi, filesystem e mount
- Creare script per controlli e avvisi sullo stato del sistema