2012-06-08 20 views
10

Tengo una carpeta llamada images en mi cuadro de Linux. Esta carpeta está conectada a un sitio web y el administrador del sitio tiene la capacidad de agregar imágenes a este sitio. Sin embargo, cuando se agrega una imagen, quiero que se ejecute un comando para cambiar el tamaño de todas las imágenes de un directorio.Ejecutar un comando de shell cuando se agrega un archivo

En resumen, quiero saber cómo puedo hacer que el servidor ejecute un comando específico cuando se agrega un nuevo archivo a una ubicación específica.

+0

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

Respuesta

22

No sé cómo las personas están cargando contenido a esta carpeta, pero es posible que desee utilizar algo de tecnología más baja que la supervisión del directorio con inotify.

Si el protocolo es FTP y tiene acceso al registro de su servidor FTP, le sugiero que rastree ese registro para ver las cargas exitosas. Este tipo de enfoque desencadenado por eventos será más rápido, más confiable y con menos carga que un método de sondeo con cron tradicional, y más portátil y más fácil de depurar que algo que use inotify.

Por supuesto, la forma de manejar esto dependerá de su servidor FTP. Tengo uno corriendo vsftpd cuyos registros incluir líneas de la siguiente manera:

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" 

La línea UPLOAD sólo se pone añadido cuando vsftpd ha guardado correctamente el archivo. Se podría analizar esto en un script de shell como esto:

#!/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 

Si estás usando una herramienta de carga HTTP, ver si esta herramienta tiene un archivo de registro de texto se utiliza para grabar los archivos entrantes. Si no considera agregarle algún tipo de función de registrador, entonces generará registros que puede tail.

+0

Esto es perfecto. Estoy usando un botón de carga php/html. Pero puedo escanear el archivo de acceso de apache para la página de carga. – Cripto

+1

Lo que no veo aquí es lo que está haciendo para desencadenar la secuencia de comandos que une el archivo de registro. –

+1

@JasonGray, ¿Está familiarizado con la opción '-F' de' tail'? ['man tail'] (http://www.freebsd.org/cgi/man.cgi?query=tail) para más detalles. El '-F' hace que' tail' espere hasta que el archivo crezca y luego lo envía a stdout. Entonces, el "disparador" para la parte

'do something'
es simplemente la adición de contenido nuevo al archivo. Esta secuencia de comandos se ejecuta una vez, tal vez al inicio, y sigue ejecutándose. La forma de lanzarlo depende de usted y depende de su sistema operativo o distribución. – ghoti

3

Es posible que desee ver en inotify

La API inotify proporciona un mecanismo para que los eventos del sistema de archivos de vigilancia. Inotify se puede usar para monitorear archivos individuales o para monitorear directorios. Cuando se supervisa un directorio, inotify devolverá eventos para el directorio en sí y para los archivos dentro del directorio.

4

Al igual que Juan comentó la API inotify es un punto de partida, sin embargo, que podría estar interesado en algunas de las herramientas que utilizan esta API para realizar tareas de notificación de archivo:

Por ejemplo incron que puede ser utilizado para ejecutar cron- como tareas cuando se detectan cambios de archivos o directorios.

O inotify-tools que es un conjunto de herramientas de línea de comandos que puede utilizar para crear su propio script de shell de notificación de archivos.

Si mira en la parte inferior del Wiki pake para inotify-tools, verá referencias a aún más herramientas y soporte para lenguajes de nivel superior como Python, Perl o Ruby (example code).

0

Uso Ghotis trabajan

Esto es lo que hice para hacer que los usuarios espacio libre:

#!/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

Si el archivo se añade a través de un proceso de carga HTTP y si el servidor es Apache, es posible que desee para verificar mod_security.

Le permite ejecutar un script para cada carga realizada a través de 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 
Cuestiones relacionadas