Script Unix: Attendez qu'un fichier existe

11

J'ai besoin d'un script qui attendra qu'un (exemplefichier.txt) apparaisse dans le répertoire / tmp

et une fois qu'il a été trouvé pour arrêter le programme, sinon pour mettre le fichier en veille jusqu'à ce qu'il soit localisé

Jusqu'à présent, j'ai:

si [ ! -f /tmp/examplefile.txt]

puis

Cidricc
la source

Réponses:

16

Cette fonction bash se bloquera jusqu'à ce que le fichier donné apparaisse ou qu'un délai donné soit atteint. Le statut de sortie sera 0 si le fichier existe; si ce n'est pas le cas, l'état de sortie reflétera combien de secondes la fonction a attendu.

wait_file() {
  local file="$1"; shift
  local wait_seconds="${1:-10}"; shift # 10 seconds as default timeout

  until test $((wait_seconds--)) -eq 0 -o -f "$file" ; do sleep 1; done

  ((++wait_seconds))
}

Et voici comment vous pouvez l'utiliser:

# Wait at most 5 seconds for the server.log file to appear

server_log=/var/log/jboss/server.log

wait_file "$server_log" 5 || {
  echo "JBoss log file missing after waiting for $? seconds: '$server_log'"
  exit 1
}

Un autre exemple:

# Use the default timeout of 10 seconds:
wait_file "/tmp/examplefile.txt" && {
  echo "File found."
}
Elifarley
la source
12
until [ -f /tmp/examplefile.txt ]
do
     sleep 5
done
echo "File found"
exit

Toutes les 5 secondes, il se réveille et recherche le fichier. Lorsque le fichier apparaît, il sortira de la boucle, vous dira qu'il a trouvé le fichier et quitter (non requis, mais bien rangé.)

Mettez cela dans un script et démarrez-le en tant que script &

Cela l'exécutera en arrière-plan.

Il peut y avoir de subtiles différences de syntaxe selon le shell que vous utilisez. Mais c'est l'essentiel.

Jeff Dodd
la source