Сбилдил дед репку
С утра рефакторил свой говно-скрипт, который ждал создания определенного файла + проверял, что файл не пустой. И затем выполнял нужные действия. Обычно для такого херачат циклы через for и while, справедливо.
Но всегда хочется большего и правильного. А в bash как раз есть третий способ реализовать подобный цикл. Называется Until. Пример, который будет бесконечно ждать создания НЕ пустого файла, выполнять полезную нагрузку и затем прекращать свою работу.
#!/bin/bash
file=/tmp/bashdays
until [ -s "$file" ]
do
sleep 1
done
echo "вот и всё"
Ключ -s как раз проверяет, существует ли файл и не пустой ли он.
У metallica есть такая песенка «until it sleeps» А чтобы скрипт крутился НЕ бесконечно, а с определенным таймаутом, делаем так:
#!/bin/bash
file=/tmp/bashdays
timeout=10
SECONDS=0
until [ -s "$file" ] || (( SECONDS >= timeout ))
do
SECONDS=$((SECONDS+1))
sleep 1
done
[ -s "$file" ] || exit 1
echo "вот и всё"
Спустя 10 секунд скрипт завершит свою работу даже если файл /tmp/bashdays отcутствует либо пустой. Ну а если все ок, то выполнится полезная нагрузка «вот и всё».
Таймауты полезны, если запускаешь скрипт по крону. Чтобы форки не плодились.
timeout=10 - задаем таймаут в секундах SECONDS=0 - инициализируем встроенный счетчик
inotify или incron, чтобы определять точное время, когда был закрыт файл. И тогда проблем можно избежать. Но это лишнее звено.Конец!








Комментарии