Repository 32bit  Forum
Repository 64bit  Wiki

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.

bash - script che monitorizza directory

Messaggioda danix » lun nov 02, 2009 21:13

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... :)
Avatar utente
danix
Staff
Staff
 
Messaggi: 3280
Iscritto il: ven ott 27, 2006 18:32
Località: Siderno (RC)
Nome Cognome: Danilo M.
Slackware: 64 14.0
Kernel: 3.2.29
Desktop: fluxbox

Re: bash - script che monitorizza directory

Messaggioda 414N » lun nov 02, 2009 21:21

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
414N
Iper Master
Iper Master
 
Messaggi: 2881
Iscritto il: mer feb 13, 2008 16:19
Località: Bulagna
Slackware: 14.0 (x64)
Kernel: 3.2.29
Desktop: LXDE

Re: bash - script che monitorizza directory

Messaggioda danix » lun nov 02, 2009 21:41

si, potrei ma scarico da vari programmi in quella directory, quindi la soluzione migliore è lo script credo...
Avatar utente
danix
Staff
Staff
 
Messaggi: 3280
Iscritto il: ven ott 27, 2006 18:32
Località: Siderno (RC)
Nome Cognome: Danilo M.
Slackware: 64 14.0
Kernel: 3.2.29
Desktop: fluxbox

Re: bash - script che monitorizza directory

Messaggioda targzeta » lun nov 02, 2009 22:26

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-..."
Linux Registered User #454438
Se pensi di essere troppo piccolo per fare la differenza, prova a dormire con una zanzara -- Dalai Lama
20/04/2013 - Io volevo Rodotà
Avatar utente
targzeta
Iper Master
Iper Master
 
Messaggi: 6168
Iscritto il: gio nov 03, 2005 14:05
Località: Carpignano Sal. (LE) <-> Pisa
Nome Cognome: Emanuele Tomasi
Slackware: current
Kernel: latest stable
Desktop: IceWM

Re: bash - script che monitorizza directory

Messaggioda ulisse89 » mar nov 03, 2009 7:56

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.
Avatar utente
ulisse89
Packager
Packager
 
Messaggi: 644
Iscritto il: sab gen 17, 2009 12:53
Località: Bologna
Nome Cognome: Riccardo
Slackware: 13.0
Kernel: 2.6.29.6
Desktop: Xfce

Re: bash - script che monitorizza directory

Messaggioda albatrosla » mar nov 03, 2009 10:40

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.
albatrosla
Packager
Packager
 
Messaggi: 1294
Iscritto il: sab mar 27, 2004 0:00
Località: Bressa - Friuli / Torino
Slackware: current
Desktop: fluxbox.git

Re: bash - script che monitorizza directory

Messaggioda raffaele181188 » mar nov 03, 2009 10:49

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
raffaele181188
Packager
Packager
 
Messaggi: 789
Iscritto il: ven set 07, 2007 20:40
Località: DearSkin (FG)
Nome Cognome: Raffaele
Slackware: current
Kernel: 2.6.29.6
Desktop: KDE 4.3
Distribuzione: Ubuntu

Re: bash - script che monitorizza directory

Messaggioda danix » mar nov 03, 2009 11:01

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... ;)
Avatar utente
danix
Staff
Staff
 
Messaggi: 3280
Iscritto il: ven ott 27, 2006 18:32
Località: Siderno (RC)
Nome Cognome: Danilo M.
Slackware: 64 14.0
Kernel: 3.2.29
Desktop: fluxbox

Re: bash - script che monitorizza directory

Messaggioda kanzy » mar nov 03, 2009 13:31

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
kanzy
Linux 2.4
Linux 2.4
 
Messaggi: 206
Iscritto il: sab mag 10, 2008 14:02
Località: Godiasco PV
Nome Cognome: Franz Fricker
Slackware: 14.0-x86_64
Kernel: 3.2.29
Desktop: kde

Re: bash - script che monitorizza directory

Messaggioda DanBadJar » mar nov 03, 2009 15:52

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
DanBadJar
Linux 3.x
Linux 3.x
 
Messaggi: 1027
Iscritto il: ven lug 28, 2006 18:27
Località: Bologna
Nome Cognome: Daniele Malavasi
Slackware: 13.1
Kernel: 2.6.34.1
Desktop: XFCE - Gnome

Re: bash - script che monitorizza directory

Messaggioda easy77 » mer nov 04, 2009 10:31

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
easy77
Linux 1.0
Linux 1.0
 
Messaggi: 57
Iscritto il: mer lug 28, 2004 23:00
Località: Cervatto (VC)

Re: bash - script che monitorizza directory

Messaggioda joe » mer nov 04, 2009 14:24

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! :)
Avatar utente
joe
Master
Master
 
Messaggi: 1950
Iscritto il: ven apr 27, 2007 10:21
Slackware: 14.0
Kernel: 3.2.29-smp
Desktop: KDE-4.8.5


Torna a Programmazione

Chi c’è in linea

Visitano il forum: Nessuno e 1 ospite

cron