Pagina 1 di 1
bash - script che monitorizza directory
Inviato: lun 2 nov 2009, 21:13
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...

Re: bash - script che monitorizza directory
Inviato: lun 2 nov 2009, 21:21
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.
Re: bash - script che monitorizza directory
Inviato: lun 2 nov 2009, 21:41
da danix
si, potrei ma scarico da vari programmi in quella directory, quindi la soluzione migliore è lo script credo...
Re: bash - script che monitorizza directory
Inviato: lun 2 nov 2009, 22:26
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-..."
Re: bash - script che monitorizza directory
Inviato: mar 3 nov 2009, 7:56
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).

Grazie.
Re: bash - script che monitorizza directory
Inviato: mar 3 nov 2009, 10:40
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.
Re: bash - script che monitorizza directory
Inviato: mar 3 nov 2009, 10:49
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

Re: bash - script che monitorizza directory
Inviato: mar 3 nov 2009, 11:01
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...

Re: bash - script che monitorizza directory
Inviato: mar 3 nov 2009, 13:31
da kanzy
grazie anche da parte mia..

proprio ciò che mi serve per una situazione pressochè identica

Re: bash - script che monitorizza directory
Inviato: mar 3 nov 2009, 15:52
da DanBadJar
Non sapevo dell'esistenza di questo comando.
Ora il mio mailserver spara una email ad ogni tentativo di accesso fallito!
Grazie Spina

Re: bash - script che monitorizza directory
Inviato: mer 4 nov 2009, 10:31
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
Re: bash - script che monitorizza directory
Inviato: mer 4 nov 2009, 14:24
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!
