Как я ожидаю файла в сценарии оболочки?

Нет способа удалить данные из запуска файла на месте. Усеченный вызов может обрезать данные из конца, но нет никакого эквивалента для обрезки пространства произвольно.

Поэтому лучшей, которую можно сделать, является копия вершины файл, перескакивающий через биты, которые Вы не хотите.

14
18.02.2015, 00:24
4 ответа

Под Linux вы можете использовать inotify подсистема ядра для эффективного ждать появления Файл в каталоге:

while read i; do if [ "$i" = sleep.txt ]; then break; fi; done \
   < <(inotifywait  -e create,open --format '%f' --quiet /tmp --monitor)
# script execution continues ...

(при условии Bash для синтаксиса выхода <() <() )

Преимущество этого подхода по сравнению с фиксированным интервалом времени, как в

while [ ! -f /tmp/sleep.txt ]; do sleep 1; done
# script execution continues ...

, это то, что Ядро спит больше. С помощью спецификации INOTIFY CEMPLIFICATION CREATE, как Создать, открыть Сценарий только для выполнения, когда файл под / TMP создается или открывается. С фиксированным временным интервалом опроса вы тратит цикловы CPU для каждого поражения.

Я включал в себя событие Open , чтобы также зарегистрироваться Touch /tmp/sleep.txt, когда файл уже существует.

22
27.01.2020, 19:50

Просто поставить свой тест в , а цикл :

while [ ! -f /tmp/sleep.txt ]; do sleep 1; done
# next command
10
27.01.2020, 19:50

В общем, довольно сложно сделать что-то надежное, кроме простого тестового/спящего цикла. Основная проблема в том, что тест будет мчаться с созданием файла -, если тест не повторять, то событие создания можно пропустить. Это, безусловно, ваш лучший выбор в большинстве случаев, когда вы будете использовать Shell для начала :

.
#!/bin/bash
while [[ ! -e /tmp/file ]] ; do
    sleep 1
done

Если вы обнаружите, что этого недостаточно из-за проблем с производительностью, то использование Shell, вероятно, не является хорошей идеей.

0
27.01.2020, 19:50

Основываясь на принятом ответе maxschlepzig (и идее из принятого ответа на https://superuser.com/questions/270529/monitoring-a-file-until-a-string-is-found), я предлагаю следующий улучшенный (, на мой взгляд, )ответ, который также может работать с тайм-аутом:

# Enable pipefail, so if the left side of the pipe fails it does not get silently ignored
set -o pipefail
( timeout 120 inotifywait -e create,open --format '%f' --quiet /tmp --monitor & ) | while read i; do if [ "$i" == 'sleep.txt' ]; then break; fi; done
EXIT_STATUS=$?
if [ "${EXIT_STATUS}" == '124' ]; then
  echo "Timeout happened"
fi

В случае, если файл не создается/не открывается в течение заданного тайм-аута, статус выхода будет 124 (в соответствии с документацией по тайм-ауту (справочная страница )). В случае, если он будет создан/открыт, статус выхода будет 0 (успех ).

Да, inotifywait запускается в подчиненной оболочке -таким образом, и эта вспомогательная оболочка -завершает работу только по истечении времени ожидания или при завершении основного сценария (, в зависимости от того, что наступит раньше ).

1
27.01.2020, 19:50

Теги

Похожие вопросы