TGViewer
Bash Days | Linux | DevOps Bash Days | Linux | DevOps @bashdays · 23.6K subscribers
Post #329 12.1K
Сбилдил дед репку

С утра рефакторил свой говно-скрипт, который ждал создания определенного файла + проверял, что файл не пустой. И затем выполнял нужные действия. Обычно для такого херачат циклы через 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
More from @bashdays
  1. Sep 30, 2026↗️ Для всех, кто строит 15 октября Cloud․ru соберет инженеров, которые строят и эксплуатир…
  2. Sep 29, 2026Самый жаркий холивар в команде — это не systemd, а какие заказать роллы на всю команду. Од…
  3. Sep 24, 2026Post #1565
  4. Sep 23, 2026Здрасти приехали, решил я в кой-то веке воспользоваться услугами Codex, создал аккаунт, по…
  5. Sep 22, 2026Всем привет, с вами TagdTagd. Сегодня опять поднимем тему архивов, но немного с другой сто…
  6. Sep 15, 2026Всем привет, с вами TagdTagd. И это вторая часть. Практическая. С первой частью можешь озн…
Threads Profile ViewerView any public Threads profile without an account.Open ThreadLook →Writing with AI? Make it sound human.Metric37 rewrites AI drafts so they read naturally. Free AI detector, 1,500 words free.Try Metric37 →