2012-06-08 11 views
10

Ho una cartella denominata immagini sulla mia macchina Linux. Questa cartella è collegata a un sito Web e l'amministratore del sito ha la possibilità di aggiungere immagini a questo sito. Tuttavia, quando viene aggiunta un'immagine, voglio un comando per eseguire il ridimensionamento di tutte le immagini di una directory.Esegue un comando shell quando viene aggiunto un file

In breve, voglio sapere come posso far eseguire al server un comando specifico quando un nuovo file viene aggiunto a una posizione specifica.

+0

http://stackoverflow.com/questions/10366411/linux-triggering-shell-command-on-file-save –

risposta

22

Non so come la gente stia caricando il contenuto in questa cartella, ma potresti voler usare qualcosa di meno tecnologico del monitoraggio della directory con inotify.

Se il protocollo è FTP e si ha accesso al registro del server FTP, suggerisco di accodare quel registro per controllare il caricamento corretto. Questo tipo di approccio innescato da eventi sarà più veloce, più affidabile e meno carico di un approccio di polling con cron tradizionale, e più portatile e più facile da eseguire il debug rispetto a qualcosa che utilizza inotify.

Il modo in cui gestisci questo dipenderà ovviamente dal tuo server FTP. Ho una corsa vsftpd cui i registri comprendono linee come questa:

Fri May 25 07:36:02 2012 [pid 94378] [joe] OK LOGIN: Client "10.8.7.16" 
Fri May 25 07:36:12 2012 [pid 94380] [joe] OK UPLOAD: Client "10.8.7.16", "/path/to/file.zip", 8395136 bytes, 845.75Kbyte/sec 
Fri May 25 07:36:12 2012 [pid 94380] [joe] OK CHMOD: Client "10.8.7.16", "/path/to/file.zip 644" 

L'UPLOAD linea unica viene aggiunto quando vsftpd ha salvato correttamente il file. Si potrebbe analizzare questo in uno script di shell come questo:

#!/bin/sh 

tail -F /var/log/vsftpd.log | while read line; do 
    if echo "$line" | grep -q 'OK UPLOAD:'; then 
    filename=$(echo "$line" | cut -d, -f2) 
    if [ -s "$filename" ]; then 
     # do something with $filename 
    fi 
    fi 
done 

Se si utilizza uno strumento di upload HTTP, vedere se questo strumento ha un file di log di testo che utilizza per registrare i file in entrata. Se non considera l'aggiunta di una sorta di funzione di logger ad esso, quindi produrrà i registri che è possibile tail.

+0

Questo è perfetto. In realtà sto usando un pulsante di caricamento php/html. Ma posso solo scansionare il file di accesso da apache per la pagina di caricamento. – Cripto

+1

Quello che non vedo qui è quello che stai facendo per attivare lo script che utilizza il file di registro. –

+1

@JasonGray, hai familiarità con l'opzione 'tail''s' -F'? ['man tail'] (http://www.freebsd.org/cgi/man.cgi?query=tail) per i dettagli. '-F' fa in modo che' tail' attenda fino a quando il file non cresce, quindi lo invia allo stdout. Quindi il "trigger" per la parte

'do something'
è semplicemente l'aggiunta di nuovi contenuti al file. Questo script viene eseguito una volta, forse all'avvio, e continua a essere in esecuzione. Il modo in cui lo lanci dipende da te e dipende dal tuo sistema operativo o dalla tua distribuzione. – ghoti

3

Si potrebbe desiderare di guardare inotify

L'API inotify fornisce un meccanismo per eventi di file di sistema di monitoraggio. Inotify può essere utilizzato per monitorare singoli file o per monitorare le directory. Quando una directory viene monitorata, inotify restituirà gli eventi per la directory stessa e per i file all'interno della directory.

4

Come John ha commentato l'API inotify è un punto di partenza, ma potreste essere interessati in alcuni strumenti che utilizzano questa API per eseguire attività di notifica del file:

Per esempio incron che può essere utilizzato per eseguire cron- attività simili quando vengono rilevate modifiche ai file o alle directory.

o inotify-tools che è un set di strumenti da riga di comando che è possibile utilizzare per creare il proprio script di shell di notifica file.

Se si osserva la parte inferiore della pedina Wiki per strumenti inotify, si vedranno riferimenti a ancora più strumenti e supporto per linguaggi di livello superiore come Python, Perl o Ruby (example code).

0

Uso ghotis lavorano

Ecco quello che ho fatto per ottenere l'utenti spazio libero:

#!/bin/bash 

tail -F -n 1 /var/log/vsftpd.log | while read line; do 
    if echo "$line" | grep -q 'OK LOGIN:'; then 
    pid=$(sed 's/.*\[\([^]]*\)\].*/\1/g' <<< "$line") 
    #the operator '<<<' doesnt exist in dash so use bash 
    if [[ $pid != *"pid"* ]]; then 
     echo -e "Disk 1: Contains Games:\n" > /home/vftp/"$pid"/FreeSpace.txt; df -h /media/Disk1/ >> /home/vftp/"$pid"/FreeSpace.txt 
     echo -e "\r\n\r\nIn order to read this properly you need to use a text editor that can read *nix format files" >> /home/vftp/"$pid"/FreeSpace.txt 
    fi 
echo "checked" 
# awk '{ sub("\r$", ""); print }' /home/vftp/"$pid"/FreeSpace.txt > /home/vftp/"$pid"/FreeSpace.txt 
    fi 
done 
0

Se il file viene aggiunto attraverso un upload HTTP, e se il server è Apache, si potrebbe desiderare per controllare mod_security.

Consente di eseguire uno script per ogni caricamento effettuato tramite HTTP POST.

0
#!/bin/bash 

tail -F -n0 /var/log/vsftpd.log | while read line; do 
    if echo "$line" | grep -q 'OK UPLOAD:'; then 
    filename=$(echo $line | cut -d, -f2 |awk '{print $1}') 
    filename="${filename%\"}" 
    filename="${filename#\"}" 
    #sleep 1s 
    if [ -s $filename ]; then 
     # do something with $filename 
     echo $filename 
    fi 
    fi 
done 
Problemi correlati