2013-02-04 11 views
8

Sto cercando di scrivere un piccolo script di bash per, una volta avviato, guardare una directory per tutti i file appena creati. Se viene visualizzato un nuovo file, voglio che la sua presenza attivi un secondo script da eseguire.Esecuzione di uno script bash al momento della creazione del file

Vedo che viene utilizzato per attivare la compressione di video digitalizzato di recente e aggiungerlo a un registro di metraggio ingerito.

Attualmente il mio codice simile a questo:

#!/bin/sh 

##VIDSTAT is a global variable coming from a parent script. 
##proj is the ingestion directory coming from a parent script 
proj=$1 

dir="/home/$USER/data/movies/$proj" 
dirlist=$(ls $dir) 


while { $VIDSTAT -eq 1 }: 
do 
    for mov in $dirlist 
    do 
     if [ "$(($(date +"%s") - $(stat -c "%Y" $mov)))" -lt "5" ] 
     then 
     ~/bin/compressNlog.sh $mov 
     fi 
    done 
done 

Esiste un/meno modo intensivo di memoria più facile/più pulito per fare questo?

EDIT Cambierò la directory di importazione per sessione di acquisizione. Ho regolato il codice di conseguenza

+2

Fai attenzione. Lo script potrebbe essere eseguito prima che l'applicazione abbia finito di scrivere il file e comprimerà un file incompleto. – Barmar

risposta

11

Che ne dici di incron? Attiva i comandi su file/modifiche alle directory.

sudo apt-get install incron 

Esempio:

<path> <mask> <command> 

Dove <path> può essere una directory (cioè la directory e/o i file direttamente in quella directory (non i file nelle sottodirectory di quella directory) sono guardato!) O un file.

<mask> può essere uno dei seguenti:

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 (*) 

<command> è il comando che deve essere eseguito quando si verifica l'evento. I seguenti wildards possono essere utilizzati all'interno della specifica di comando:

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

Se si guarda una directory, allora $ @ detiene il percorso della directory e $ # il file che ha attivato l'evento. Se si guarda un file, $ @ mantiene il percorso completo del file e $ # è vuoto.

di lavoro Esempio:

$sudo echo spatel > /etc/incron.allow 
$sudo echo root > /etc/incron.allow 

Inizio Daemon:

$sudo /etc/init.d/incrond start 

Modifica incrontab file di

$incrontab -e 
/home/spatel IN_CLOSE_WRITE touch /tmp/incrontest-$# 

test è

$touch /home/spatel/alpha 

Risultato:

$ls -l /tmp/*alpha* 
-rw-r--r-- 1 spatel spatel 0 Feb 4 12:32 /tmp/incrontest-alpha 

Note: In Ubuntu è necessario attivare il inotify al momento dell'avvio. Aggiungi la riga seguente nel menu di Grub.lst file:

kernel /boot/vmlinuz-2.6.26-1-686 root=/dev/sda1 ro inotify=yes 
+1

Questa sembra una buona soluzione, anche se cambierò la directory per sessione di ingestione. Sarebbe più efficiente modificare le tabelle di incron due volte per sessione, o utilizzare una soluzione che viene eseguita come un processo e muore in seguito? – Simianspaceman

+0

Ho alcuni problemi che aggiungono voci all'incrontab. Mi dice sia il mio utente che il root "non posso usare incrontab" – Simianspaceman

+1

Crea il file /etc/incron.allow (controlla etc/incron.conf se questo è il file giusto per consentire agli utenti) e aggiungi root e il tuo utente – Satish

0

Si può fare questo con il inotify strumento magico:

inotifywait -r -m ./YOUR_MONITORED_DIR | 
    while read a b file; do 
     [[ $b == *CREATE* ]] && ./another_script "$file" 
    done 

Questo metodo ha il grande vantaggio di evitare il polling ogni n secondi.

Inotify (inode notifica) è un sottosistema del kernel di Linux che agisce per estendere filesystem per notare le modifiche al filesystem, e segnalare quei modifiche alle applicazioni. Sostituisce una funzione precedente, dnotify, che aveva obiettivi simili.

http://en.wikipedia.org/wiki/Inotify
Vedi inotify doc

1

Usa iwatch. No davvero. Gestirà tutti i dettagli della creazione di un demone, eseguendo all'avvio, monitorando e registrando, così via e così via. Tutto quello che devi fare è impostare le opzioni e fare in modo che lo script di bash gestisca i dettagli di fare effettivamente qualcosa con il file.

+0

È un wrapper su 'inotify', quindi ci vorranno più risorse. –

+1

corso @sputnick lo farà. Ma avere qualcun altro avvolgere tutta quella logica daemon per noi supera di gran lunga i pochi mega necessari per far funzionare la cosa, IMHO. –

Problemi correlati