GNU/Linux >> Linux Esercitazione >  >> Ubuntu

Come eseguire comandi su modifiche di file o directory con Incron su Ubuntu

Questo tutorial mostra come utilizzare incron su un sistema Ubuntu per eseguire comandi quando viene modificato un file o una directory. Il demone incron è simile a cron, ma invece di eseguire comandi in base al tempo, può attivare comandi quando si verifica un evento di un file o di una directory (ad es. una modifica del file, dei permessi, ecc.).

1 Installazione di Incron

I seguenti passaggi devono essere eseguiti come utente root. Accedi alla shell del tuo sistema Ubuntu e diventa root con:

sudo su

Il software Incron è disponibile nel repository di Ubuntu. Pertanto, lo installerò con apt in questo modo:

apt-get install incron

3 Come usare Incron

Come accennato nel primo capitolo, Incron ha molte somiglianze con lo strumento Cron. Laddove Cron ha il suo comando crontab per gestire i cronjob, Incron ha il comando incrontab. Puoi utilizzare il comando incrontab  elenco opzioni (-l), modificare (-e) e rimuovere (-r) per mostrare e modificare le voci incrontab.

Esegui il comando seguente per avere una panoramica completa su incrontab:

man incrontab

Nella pagina man troverai la seguente nota:

Se /etc/incron.allow esiste solo gli utenti elencati qui possono usare incron. Altrimenti se /etc/incron.deny esiste solo gli utenti NON elencati qui possono usare incron. Se nessuno di questi file esiste, tutti possono usare incron. (Nota importante:questo comportamento non è sicuro e sarà probabilmente modificato per essere compatibile con lo stile utilizzato da ISC Cron.) La posizione di questi file può essere modificata nella configurazione.

Ciò significa che se vogliamo usare incrontab come root, dobbiamo eliminare /etc/incron.allow (che non è sicuro)...

rm -f /etc/incron.allow

... oppure aggiungiamo l'utente root al file incron.allow (che è l'opzione consigliata). Apri il file /etc/incron.allow:

nano /etc/incron.allow

E aggiungi la riga seguente.

root

Prima di farlo, riceverai messaggi di errore come questo quando proverai a utilizzare incrontab:

server1:~# incrontab -l
user 'root' is not allowed to use incron
server1:~#

Dopo funziona:

server1:~# incrontab -l
no table for root
server1:~#

Ora possiamo usare questo comando:

incrontab -e

Per creare lavori incron. Ora diamo uno sguardo più approfondito alla pagina man per capire la sintassi.

man 5 incrontab

La manpage mostra il formato delle righe di tabulazione di cron. Il formato segue questo schema:

<path> <mask> <command>

...dove  è una directory o un file. Tieni presente che incron non è in grado di guardare i file nelle sottodirectory della directory che hai impostato, quindi verranno osservati solo i file in quella directory.

può essere una delle seguenti opzioni:

IN_ACCESS           File was accessed (read) (*)
IN_ATTRIB           Metadata changed (permissions, timestamps, extended attributes, etc.) (*)
IN_CLOSE_WRITE      File opened for writing was closed (*)
IN_CLOSE_NOWRITE    File not opened for writing was closed (*)
IN_CREATE           File/directory created in watched directory (*)
IN_DELETE           File/directory deleted from watched directory (*)
IN_DELETE_SELF           Watched file/directory was itself deleted
IN_MODIFY           File was modified (*)
IN_MOVE_SELF        Watched file/directory was itself moved
IN_MOVED_FROM       File moved out of watched directory (*)
IN_MOVED_TO         File moved into watched directory (*)
IN_OPEN             File was opened (*)

Durante il monitoraggio di una directory, gli eventi contrassegnati da un asterisco (*) sopra possono verificarsi per i file nella directory, nel qual caso il campo del nome nei
dati dell'evento restituito identifica il nome del file all'interno della directory.

Il simbolo IN_ALL_EVENTS è definito come una maschera di bit di tutti gli eventi di cui sopra. Due simboli di convenienza aggiuntivi sono IN_MOVE, che è una combinazione di IN_MOVED_FROM e IN_MOVED_TO, e IN_CLOSE che combina IN_CLOSE_WRITE e IN_CLOSE_NOWRITE.

Nella maschera possono essere specificati i seguenti ulteriori simboli:

IN_DONT_FOLLOW      Don't dereference pathname if it is a symbolic link
IN_ONESHOT          Monitor pathname for only one event
IN_ONLYDIR          Only watch pathname if it is a directory

Inoltre, c'è un simbolo che non appare nel set di simboli inotify. È IN_NO_LOOP. Questo simbolo disabilita il monitoraggio degli eventi finché quello corrente non viene completamente gestito (fino alla chiusura del processo figlio).

è il comando da eseguire quando si verifica l'evento. I seguenti jolly possono essere utilizzati all'interno della specifica del comando:

$$   dollar sign
[email protected]   watched filesystem path (see above)
$#   event-related file name
$%   event flags (textually)
$&   event flags (numerically)

Se guardi una directory, [email protected] conserva il percorso della directory e $# il file che ha attivato l'evento. Se guardi un file, [email protected] conserva il percorso completo del file e $# è vuoto.

Se hai bisogno dei caratteri jolly ma non sei sicuro di cosa si traducano, puoi creare un processo incron come questo.

Crea una directory da guardare:

mkdir /tmp/testdir

Quindi apri l'incrontab:

incrontab -e

e aggiungi la seguente riga:

/tmp/testdir/ IN_MODIFY echo "$$ [email protected] $# $% $&"

Quindi crei o modifichi un file nella directory /tmp/testdir/ e dai un'occhiata a /var/log/syslog:questo registro mostra quando è stato attivato un processo incron, se è riuscito o se ci sono stati errori e qual è il reale comando è stato eseguito (ovvero, i caratteri jolly vengono sostituiti con i loro valori reali).

A scopo di test, aggiungerò due file, helloworld.txt e helloworld2.txt in /tmp/testdir/ con il comando eco:

echo 'How are you?' > /tmp/testdir/helloworld.txt
echo 'How are you?' > /tmp/testdir/helloworld2.txt

Quindi controlliamo il syslog con la coda per incron ecents:

tail /var/log/syslog
...
Apr 12 18:49:22 server1 incrond[6441]: (root) CMD (echo "$ /tmp/testdir/ helloworld.txt IN_MODIFY 2")
Apr 12 18:50:31 server1 incrond[6441]: (root) CMD (echo "$ /tmp/testdir/ helloworld2.txt IN_MODIFY 2")

Ora basta teoria. Creiamo i nostri primi lavori incron. Vorrei monitorare il file /etc/apache2/apache2.conf e la directory /etc/apache2/vhosts/, e ogni volta che ci sono modifiche, voglio che incron riavvii Apache. Ecco come lo facciamo:

incrontab -e
/etc/apache2/apache2.conf IN_MODIFY /usr/sbin/service apache2 restart
/etc/apache2/sites-available/ IN_MODIFY /usr/sbin/service apache2 restart

Questo è tutto. A scopo di test puoi modificare la tua configurazione di Apache e dare un'occhiata a /var/log/syslog, e dovresti vedere che incron riavvia Apache.

NOTA :non eseguire alcuna azione all'interno di un processo incron in una directory che controlli per evitare loop. Esempio: Quando controlli la directory /tmp per le modifiche e ogni modifica attiva uno script che scrive un file di registro in /tmp, ciò causerà un ciclo e potrebbe portare il tuo sistema a un carico elevato o addirittura bloccarlo.

Per elencare tutti i lavori incron definiti, puoi eseguire:

incrontab -l
server1:~# incrontab -l
/etc/apache2/apache2.conf IN_MODIFY /usr/sbin/service apache2 restart
/etc/apache2/vhosts/ IN_MODIFY /usr/sbin/service apache2 restart
server1:~#

Per eliminare tutti i lavori incron dell'utente corrente, eseguire:

incrontab -r
server1:~# incrontab -r
removing table for user 'root'
table for user 'root' successfully removed
server1:~#

  • incron:http://inotify.aiken.cz/?section=incron&page=about&lang=en

Ubuntu
  1. Attivazione di comandi su modifiche di file/directory con Incron su Debian Etch

  2. Come eseguire il programma Hadoop MapReduce su Ubuntu 16.04

  3. Come installare il file deb in Ubuntu (con esempi)

  4. Come modificare la directory di lavoro quando si apre un file con un doppio clic sul desktop di Ubuntu?

  5. Come eseguire uno script di shell quando un file o una directory cambia?

Come eliminare una directory in Ubuntu 20.04

Come eliminare un file in Ubuntu

Come configurare il networking con Netplan su Ubuntu

Come eseguire file .bin e .run in Ubuntu

Come eseguire il flashing/masterizzare un'immagine del sistema operativo con Etcher su Ubuntu

Come rimuovere i dati di file Exif con ExifTool in Ubuntu 20.04