43 votes

Script Bash, dossier de veille, exécuter la commande

Je suis en train de créer un script bash qui prend 2 paramètres: un répertoire et une commande. J'ai besoin de regarder ce répertoire pour les modifications et lorsque quelque chose a été changé je besoin pour exécuter la commande. Je suis vraiment nouveau à l'écriture de scripts bash et je ne suis pas vraiment sûr de ce que je suis en train de faire, alors allez facile sur moi. Je suis aussi sur un mac, pas linux. Tous les pointeurs, ou de ressources externes aiderait grandement. Je sais que beaucoup de gens essaient de ça sur internet, et personne ne peut le sembler obtenir ce droit. Je suis vraiment essayer de l'imiter SASS montre fonctionnalités.

#!/bin/bash

#./watch.sh $PATH $COMMAND

DIR=$1  

ls -l $DIR > $DIR/.begin
#this does not work
DIFFERENCE=$(diff .begin .end)

if [ $DIFFERENCE = '\n']; then
    #files are same
else
    $2
fi 

ls -l $DIR > $DIR/.end

42voto

Radek Points 1908

En permanence de manière récursive dossier moniteur (md5) et exécuter une commande sur le changement:

daemon() {
    chsum1=""

    while [[ true ]]
    do
        chsum2=`find src/ -type f -exec md5 {} \;`
        if [[ $chsum1 != $chsum2 ]] ; then           
            compile
            chsum1=$chsum2
        fi
        sleep 2
    done
}

Fonctionne sur mes OS X que je n'ai pas digest.

Sur Linux, vous pouvez utiliser md5sum comme un remplacement pour l' md5 commande.

13voto

Evi1M4chine Points 509

Je ne peux pas croire que personne n'a posté ce encore.

D'abord assurez - inotify-tools installé.

Ensuite les utiliser comme ceci:

logOfChanges="/tmp/changes.log.csv" # Set your file name here.

# Lock and load
inotifywait -mrcq $DIR > "$logOfChanges" &
IN_PID=$$

# Do your stuff here
...

# Kill and analyze
kill $IN_PID
cat "$logOfChanges" | while read entry; do
   # Split your CSV, but beware that file names may contain spaces too.
   # Just look up how to parse CSV with bash. :)
   path=... 
   event=...
   ...  # Other stuff like time stamps?
   # Depending on the event…
   case "$event" in
     SOME_EVENT) myHandlingCode path ;;
     ...
     *) myDefaultHandlingCode path ;;
done

Par ailleurs, en utilisant --format au lieu de -c sur inotifywait serait une bonne idée.

Juste man inotifywait et man inotifywatch pour plus d'infos.

11voto

Swift Points 6363

MÉTHODE 1:

#!/bin/sh

check() {
    dir="$1"
    chsum1=`digest -a md5 $dir | awk '{print $1}'`
    chsum2=$chsum1

    while [ $chsum1 -eq $chsum2 ]
    do
        sleep 10
        chsum2=`digest -a md5 $dir | awk '{print $1}'`
    done

    eval $2
}

check $*

Ce script prend deux paramètres [répertoire, la commande]. Toutes les 10 secondes, le script s'exécute check() voir le dossier a changé. Si non, elle dort et le cycle se répète.

Dans le cas où le dossier a changé, c' evals de votre commande.

MÉTHODE 2:
Utiliser un cron pour suivre le dossier.

Vous devrez installer incron:

 sudo apt-get install incron

Et puis vous êtes script devrait ressembler à quelque chose comme ceci:

#!/bin/bash
eval $1

(Vous n'aurez pas besoin de spécifier le dossier puisque ce sera la tâche de la tâche de surveiller le répertoire spécifié)

Un plein, travail exemple peut être trouvé ici:

http://www.errr-online.com/index.php/2011/02/25/monitor-a-directory-or-file-for-changes-on-linux-using-inotify/

3voto

John Vargo Points 56

Dans Mac OS X, vous pouvez simplement cliquez sur un dossier, puis cliquez sur "Actions du Dossier de Configuration'. Cela vous permettra de joindre des actions pour un dossier, c'est à dire l'exécution de scripts.

OS X est livré avec un certain nombre de scripts prêts à l'emploi, ou vous pouvez créer votre propre.

1voto

ThomasReggi Points 4025

Presque 3 ans plus tard et je recommande ce grognement en fonction de la solution.

J'ai créé un exemple ici https://github.com/reggi/watch-execute.

Voici l' Gruntfile.js:

module.exports = function (grunt) {
  grunt.initConfig({
    shell: {
      run_file:{
        command: 'sh ./bash.sh',
        options: {
            stdout: true
        }
      }
    },
    watch: {
      run_file: {
        files: ["./watchme/*"],
        tasks: ["shell:run_file"]
      }
    }
  });
  grunt.loadNpmTasks('grunt-contrib-watch');
  grunt.loadNpmTasks('grunt-shell');
};

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X