systemd
di oggi legge la sua configurazione di inizializzazione per ogni demone da una raccolta di file unit , che spesso vengono chiamate semplicemente unità . Con unità di percorso , puoi monitorare file e directory per determinati eventi. Se si verifica un evento specifico, un'unità di servizio viene eseguito e di solito porta lo stesso nome dell'unità di percorso. Mostrerò come funziona con un semplice esempio.
Supponiamo di voler monitorare un file. Ogni volta che il file viene chiuso dopo una scrittura, dovrebbe iniziare uno script specifico.
L'unità di percorso:example.path
Nella directory /etc/systemd/system/
creiamo il file example.path
con il seguente contenuto:
[Unit]
Description=Monitor the file for changes
[Path]
PathChanged=/home/john/testfile
Unit=example.service
[Install]
WantedBy=multi-user.target
Nel [Path]
sezione, PathChanged=
specifica il percorso assoluto del file da monitorare, mentre Unit=
indica quale unità di servizio eseguire se il file cambia. Questa unità (example.path
) dovrebbe essere avviato quando il sistema è in modalità multiutente.
Successivamente, creiamo l'unità di servizio corrispondente example.service
in /etc/systemd/system/
.
L'unità di servizio:example.service
Se il file testfile
modifiche (il che significa che è sia scritto che chiuso), verrà chiamata la seguente unità di servizio per eseguire lo script specificato:
[Unit]
Description=Executes script when a file has changed.
[Service]
Type=simple
ExecStart=/home/john/script.sh
[Install]
WantedBy=multi-user.target
In questo esempio, il file script.sh
contiene solo il seguente codice:
#!/bin/bash
echo "file changed" >/home/john/output.txt
Per testare l'unità di percorso, entrambe queste nuove unità devono essere attivate, quindi esegui:
$ sudo systemctl enable example.{path,service}
$ sudo systemctl start example.path
Se ora riscrivi o scrivi nel file testfile
, viene eseguita l'unità di servizio corrispondente e il file output.txt
viene creato nell'utente john
home directory di.
Il seguente elenco incompleto e non esaustivo fornisce alcuni esempi in cui le unità di percorso potrebbero rendere un po' più semplice il tuo Sysadmin Day:
- Avvia l'elaborazione dei dati basata sugli eventi.
- Controlla i file in
/etc
e invia una notifica quando si verificano modifiche. - Controlla l'
import
cartella per i nuovi file e avvia l'elaborazione.
Cose di cui essere a conoscenza
Durante i miei test con le unità di percorso, ho notato che non tutti gli eventi vengono rilevati in determinate circostanze. Ad esempio, imposta un'unità di percorso per monitorare un percorso per le modifiche, quindi esegui il comando seguente:
$ touch /path/file && rm /path/file
Mi aspetto che l'unità di servizio venga eseguita due volte, qui:la prima volta per il touch
comando e la seconda volta per rm
comando. Ho presentato una segnalazione Bugzilla per vedere se questo problema è dovuto al design o a un problema tecnico che può essere risolto.
Fonti e link correlati
Se vuoi saperne di più su systemd
unità, incluse le unità di percorso e di servizio, dai un'occhiata alle seguenti pagine man:
- unità di sistema (5)
- percorso systemd.(5)
- systemd.service (5)
Inoltre, se sei interessato ai risultati della mia segnalazione di bug, puoi seguirla qui:
Bug 1722627 - Path Unit non intercetta tutti gli eventi