Сбилдил дед репку

С утра рефакторил свой говно-скрипт, который ждал создания определенного файла + проверял, что файл не пустой. И затем выполнял нужные действия. Обычно для такого херачат циклы через 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 - инициализируем встроенный счетчик

Роман Шубин
Роман Шубин
CEO & CTO, Главред в «Цифровой улей»
Задать вопрос
Минусы конечно же есть, например время таймаута 10 секунд, файл был создан через 3 секунды, НО записывается 60 секунд. В этом случае скрипт выполнится все равно успешно. Этот момент стоит сразу учитывать и закладывать изначально адекватные значения.
Ну либо навешать пиздюлей через inotify или incron, чтобы определять точное время, когда был закрыт файл. И тогда проблем можно избежать. Но это лишнее звено.

Конец!