Skrypt uniksowy: Zaczekaj na istnienie pliku

13

Potrzebuję skryptu, który będzie oczekiwał na pojawienie się pliku (examplefile.txt) w katalogu / tmp

a gdy okaże się, że zatrzyma program, w przeciwnym razie spać plik, dopóki nie zostanie zlokalizowany

Do tej pory mam:

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

następnie

Cidricc
źródło

Odpowiedzi:

17

Ta funkcja bash będzie blokować, dopóki nie pojawi się dany plik lub nie upłynie określony limit czasu. Status wyjścia będzie wynosił 0, jeśli plik istnieje; jeśli nie, status wyjścia będzie odzwierciedlał liczbę sekund, na które funkcja czekała.

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))
}

A oto jak możesz go użyć:

# 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
}

Inny przykład:

# Use the default timeout of 10 seconds:
wait_file "/tmp/examplefile.txt" && {
  echo "File found."
}
Elifarley
źródło
Bardziej precyzyjnym sposobem obliczenia limitu czasu jest prawdopodobnie:start=`date +%s`; while (( `date +%s` - start > 10 )); do sleep 1; done
x-yuri
14
until [ -f /tmp/examplefile.txt ]
do
     sleep 5
done
echo "File found"
exit

Co 5 sekund budzi się i szuka pliku. Kiedy plik się pojawi, wypadnie z pętli, powie, że znalazł plik i wyjdzie (nie wymagane, ale uporządkowane).

Umieść to w skrypcie i uruchom jako skrypt &

To uruchomi go w tle.

Mogą występować subtelne różnice w składni w zależności od używanej powłoki. Ale to jest sedno tego.

Jeff Dodd
źródło