bash - script che monitorizza directory

Forum dedicato alla programmazione.

Moderatore: Staff

Regole del forum
1) Citare in modo preciso il linguaggio di programmazione usato.
2) Se possibile portare un esempio del risultato atteso.
3) Leggere attentamente le risposte ricevute.
4) Scrivere i messaggi con il colore di default, evitare altri colori.
5) Scrivere in Italiano o in Inglese, se possibile grammaticalmente corretto, evitate stili di scrittura poco chiari, quindi nessuna abbreviazione tipo telegramma o scrittura stile SMS o CHAT.
6) Appena registrati è consigliato presentarsi nel forum dedicato.

La non osservanza delle regole porta a provvedimenti di vari tipo da parte dello staff, in particolare la non osservanza della regola 5 porta alla cancellazione del post e alla segnalazione dell'utente. In caso di recidività l'utente rischia il ban temporaneo.
Rispondi
Avatar utente
danix
Staff
Staff
Messaggi: 3287
Iscritto il: ven 27 ott 2006, 19:32
Nome Cognome: Danilo M.
Slackware: 64 current
Kernel: 5.4.43 x86_64
Desktop: i3
Località: Siderno (RC)
Contatta:

bash - script che monitorizza directory

Messaggio da danix »

Ciao a tutti,
come si può fare in modo che uno script rimanga in esecuzione continua dal boot fino allo spegnimento e monitorizzi una determinata directory notificando i cambiamenti??

Ad esempio, ho una directory locale sul laptop in cui scarico archivi, documenti e una varietà di files diversi, e vorrei fare in modo che uno script controlli continuamente questa directory e appena trova un nuovo file lo sposti nella directory corretta, ~/docs se è un pdf, ~/musica se è un mp3 ecc...

La parte della selezione dei files la faccio con find, ma come faccio a far girare di continuo lo script?? uso cron??


Consigliatemi... :)
danix
myself ha scritto:non sono molto presente sul forum, e di ciò mi scuso con tutti

Avatar utente
414N
Iper Master
Iper Master
Messaggi: 2922
Iscritto il: mer 13 feb 2008, 16:19
Slackware: 15.0
Kernel: 5.15.19
Desktop: KDE5
Località: Bulagna
Contatta:

Re: bash - script che monitorizza directory

Messaggio da 414N »

Beh, puoi risolvere il problema a monte usando Kget e la sua gestione delle directory dei download per estensione, se si tratta di file che scarichi.

Avatar utente
danix
Staff
Staff
Messaggi: 3287
Iscritto il: ven 27 ott 2006, 19:32
Nome Cognome: Danilo M.
Slackware: 64 current
Kernel: 5.4.43 x86_64
Desktop: i3
Località: Siderno (RC)
Contatta:

Re: bash - script che monitorizza directory

Messaggio da danix »

si, potrei ma scarico da vari programmi in quella directory, quindi la soluzione migliore è lo script credo...
danix
myself ha scritto:non sono molto presente sul forum, e di ciò mi scuso con tutti

Avatar utente
targzeta
Iper Master
Iper Master
Messaggi: 6631
Iscritto il: gio 3 nov 2005, 14:05
Nome Cognome: Emanuele Tomasi
Slackware: 64-current
Kernel: latest stable
Desktop: IceWM
Località: Carpignano Sal. (LE) <-> Pisa

Re: bash - script che monitorizza directory

Messaggio da targzeta »

Ricordavo di aver letto di una chiamata di sistema che ti permette di mettere in wait un programma nell'attesa di un evento su un inode. Ho googlato un po' ed ho trovato quello che cercavo. Esiste un comando che dovrebbe fare al caso tuo:
http://linux.die.net/man/1/inotifywait

Non sono su linux e quindi non so se è presente su Slackware.

Fammi sapere,
Emanuele

Edit: Si, il pacchetto esiste. E' sotto la directory "a/" si cihama "inotify-tools-..."
Se pensi di essere troppo piccolo per fare la differenza, prova a dormire con una zanzara -- Dalai Lama

Avatar utente
ulisse89
Packager
Packager
Messaggi: 643
Iscritto il: sab 17 gen 2009, 12:53
Nome Cognome: Riccardo
Slackware: 13.0
Kernel: 2.6.29.6
Desktop: Xfce
Località: Bologna

Re: bash - script che monitorizza directory

Messaggio da ulisse89 »

E' una cosa che servirebbe molto anche a me. Se ti va, quando lo hai finito lo potresti postare, così lo uso pure io (che non lo saprei fare). :D
Grazie.

albatrosla
Packager
Packager
Messaggi: 1339
Iscritto il: sab 27 mar 2004, 0:00
Slackware: current
Desktop: fluxbox.git
Località: Collegno, but made in Friûl
Contatta:

Re: bash - script che monitorizza directory

Messaggio da albatrosla »

Secondo me, usi ls e fai fare il diff tra l'output corrente e il precedente. Il diff ti dà anche la path dei nuovi file, quindi puoi spostarli. Per eseguirlo a cadenza, cron va bene solo se non vuoi fare un demone, cosa che in questo caso forse è più opportuna.

Avatar utente
raffaele181188
Packager
Packager
Messaggi: 789
Iscritto il: ven 7 set 2007, 21:40
Nome Cognome: Raffaele
Slackware: current
Kernel: 2.6.29.6
Desktop: KDE 4.3
Distribuzione: Ubuntu
Località: DearSkin (FG)

Re: bash - script che monitorizza directory

Messaggio da raffaele181188 »

Per me invece è più comodo seguire il suggerimento di Spina. Tra l'altro ho notato che esistono pure i binding per Python quindi, volendo, ci si può proprio sfiziare senza nemmeno perderci tempo :D

Avatar utente
danix
Staff
Staff
Messaggi: 3287
Iscritto il: ven 27 ott 2006, 19:32
Nome Cognome: Danilo M.
Slackware: 64 current
Kernel: 5.4.43 x86_64
Desktop: i3
Località: Siderno (RC)
Contatta:

Re: bash - script che monitorizza directory

Messaggio da danix »

io partendo dal suggerimento di spina ho tirato fuori questo:

Codice: Seleziona tutto

#! /bin/bash

###############################################################################
#                                                                             #
# inomover.sh - a script that monitors a directory and moves a list of known  #
#               files to some predefined directory according to their         #
#               extensions.                                                   #
#                                                                             #
#       Both destination dirs and extension lists can be modified.            #
#                                                                             #
#       Default watched directory is provided as argument to the script.      #
#                                                                             #
#       This script uses inotifywait(1) from inotify-tools, you can find the  #
#       source files at http://inotify-tools.sourceforge.net/                 #
#       Most Linux distributions comes with a precompiled version.            #
#                                                                             #
#                                                                             #
#               Author: danix < danix@danixland.net >                         #
#       Many thanks to Emanuele Tomasi (aka spina) from the Slacky.eu         #
#       community for pointing me to this set of tools. ;-)                   #
#                                                                             #
###############################################################################

check_dir=$1
video_dir="/opt/media/videos"
audio_dir="/opt/media/musica/temporary"
video_ext="mp4 flv avi divx mpg mpeg"
audio_ext="mp3"

while inotifywait -e create $check_dir ;do
        for ext in $video_ext; do
                find . -maxdepth 1 -name "*.$ext" -exec mv '{}' $video_dir \;
        done
        for ext in $audio_ext; do
                find . -maxdepth 1 -name "*.$ext" -exec mv '{}' $audio_dir \;
        done
done
funziona esattamente come volevo io e non è esoso in termini di risorse, basta lanciarlo una volta tramite rc.local e te ne dimentichi... ;)
danix
myself ha scritto:non sono molto presente sul forum, e di ciò mi scuso con tutti

kanzy
Linux 2.x
Linux 2.x
Messaggi: 210
Iscritto il: sab 10 mag 2008, 15:02
Slackware: 14.2

Re: bash - script che monitorizza directory

Messaggio da kanzy »

grazie anche da parte mia.. =D> proprio ciò che mi serve per una situazione pressochè identica \:D/
l'uomo ha bisogno di cibo rifugio e storie

Avatar utente
DanBadJar
Linux 4.x
Linux 4.x
Messaggi: 1027
Iscritto il: ven 28 lug 2006, 19:27
Nome Cognome: Daniele Malavasi
Slackware: 13.1
Kernel: 2.6.34.1
Desktop: XFCE - Gnome
Località: Bologna
Contatta:

Re: bash - script che monitorizza directory

Messaggio da DanBadJar »

Non sapevo dell'esistenza di questo comando.
Ora il mio mailserver spara una email ad ogni tentativo di accesso fallito!

Grazie Spina :thumbright:

Avatar utente
easy77
Linux 0.x
Linux 0.x
Messaggi: 57
Iscritto il: gio 29 lug 2004, 0:00
Località: Cervatto (VC)
Contatta:

Re: bash - script che monitorizza directory

Messaggio da easy77 »

In alternativa, ma non è uno scritpt, si può scrivere una semplicissima applicazione o servizio Mono che usa la classe FileSystemWatcher, molto semplice da usare:
http://msdn.microsoft.com/en-us/library ... tcher.aspx

Avatar utente
joe
Iper Master
Iper Master
Messaggi: 3797
Iscritto il: ven 27 apr 2007, 11:21
Slackware: 15.0
Kernel: 5.15.38
Desktop: dwm

Re: bash - script che monitorizza directory

Messaggio da joe »

Si potrebbe anche fare qualcosa del genere forse:

/usr/mybin/dirmonitor.sh

Codice: Seleziona tutto

#!/bin/bash

dirmonitor()
{
 controlla se c'è un file nuovo e spostalo
 dove va messo
}

while [ 1 ]; do
 sleep 3
 dirmonitor
done
Poi portresti fare uno script in stile "servizio" da tipo
/etc/rc.d/rc.dirmonitor.

Codice: Seleziona tutto

#!/bin/bash

DIRMON=/usr/mybin/dirmonitor.sh
DRM_PID="pidof -x dirmonitor.sh"
LOGDIR=/var/log/dirmonitor
LOGERR=$LOGDIR/logverbose
[ ! -d $LOGDIR ] && mkidr -p $LOGDIR                                                                 


dirmon_start() {
        $($DRM_PID >/dev/null) && echo "DirMonIToR daemon already running: nothing to do, bye." && return
        echo "Starting DirMonIToR .  .  .  ."
        $DIRMON 2>$LOGERR & disown %1
        sleep 3 
        $($DRM_PID >/dev/null) && echo "Ok, daemon is running as $($DRM_PID) PID" || exit 1
}

dirmon_stop() {
        ! $($DRM_PID >/dev/null) && echo "DirMonIToR daemon not running" && return
        echo "Stopping DirMonIToR daemon .  .  .  ."
        kill $($DRM_PID)
        sleep 3
        ! $($DRM_PID >/dev/null) && echo "Ok, DirMonIToR daemon is stopped" || exit 1
}
Ho preso spunto da un mio script demoniaco per tenermi su la connessione.
È solo un'idea ovviamente da valutare testare verificare eccecc...
Mi sembrava giusto condividerlo. Vorrei evidenziare il comando "disown%1"
dopo il lancio in background dello script dirmonitor.sh è un trucco penso
buono per demonizzare un'applicazione.
Saluti! :)

Rispondi