С утра рефакторил свой говно-скрипт, который ждал создания определенного файла + проверял, что файл не пустой. И затем выполнял нужные действия. Обычно для такого херачат циклы через
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 - инициализируем встроенный счетчик
Встроенная переменная SECONDS в Bash является специальной переменной, которая автоматически инкрементируется на количество секунд, прошедших с начала выполнения текущего скрипта или текущей подобной конструкции. Как только скрипт начинает выполнение, `SECONDS` начинает отсчитывать время с 0 и увеличивается на 1 каждую секунду. Это позволяет удобно отслеживать время выполнения скрипта или определенной части кода.
Минусы конечно же есть, например время таймаута 10 секунд, файл был создан через 3 секунды, НО записывается 60 секунд. В этом случае скрипт выполнится все равно успешно. Этот момент стоит сразу учитывать и закладывать изначально адекватные значения.
Ну либо навешать пиздюлей через
inotify или incron, чтобы определять точное время, когда был закрыт файл. И тогда проблем можно избежать. Но это лишнее звено.Конец!
tags: #bash #linux
@BАSHDАYS | BАSHDАYS.CОM