сценарий оболочки для проверки доступности файла в течение 1 часа, через час, если файла нет, будет эхо-сообщение «Time Out»

Различные google-perftoolsпакеты не имеют необходимых Multi-Arch:объявлений в их управляющем файле , поэтому нет возможности установить пакеты i386и amd64в параллельная (нехватка принудительной -их установки, что вызовет aptмного жалоб и не позволит установить или обновить любой другой пакет ).

Возможно, вы захотите отправить сообщение об ошибке с просьбой включить эту функцию. Для этого запустите reportbug libgoogle-perftools-devи следуйте подсказкам.

См. Как запустить 32 -битные программы на 64 -битном Debian/Ubuntu? для других способов запуска 32 -битных программ в 64 -битной системе (, предложенных Жилем).

1
10.03.2020, 17:22
3 ответа

Думаю, вы уже близки к этому, но некоторые аспекты вашего сценария кажутся -сложными.

Вы можете попробовать следующий цикл while:

#!/bin/sh

timeout=3600
granularity=300
elapsed=0

echo "Please enter the filename"
read -r file

while [ "$elapsed" -lt "$timeout" ]
do
    if [ -f "$file" ]
    then
        break
    fi

    sleep "$granularity"
    elapsed=$((elapsed+granularity))
done

# Was the loop broken because the file appeared, or did it time out?
if [ -f "$file" ]
then
    echo "$file has appeared"
else
    echo "Time over"
fi

Каждые $granularityсекунд будет проверяться наличие файла, пока не будет превышено значение $timeout. Если файл появился, скрипт выйдет из цикла.

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

0
28.04.2021, 23:20

Альтернативный подход, который позволяет избежать недостатков опроса (компромисса -между потреблением ресурсов для коротких циклов опроса и задержкой обнаружения изменений для длинных циклов опроса ). Плата за это заключается в том, что он опирается на инструменты, которые могут быть вам недоступны, а именно inotify -инструменты иtimeout(последний из GNU Coreutils).

Предполагая, что смысл «проверки доступности» заключается в том, что вы ожидаете создания файла (, имя которого находится в переменной fname):

timeout 3600 sh -c '
    if [ -e "$1" ]; then
        printf "%s is present already\n" "$1"
        exit
    fi
    while inotifywait -qq -e create dir; do
    if [ -e "$1" ]; then
        printf "%s present\n" "$1"
        exit
    fi
done' mysh "$fname"
[ "$?" -eq 124 ] && echo "Time over"

timeoutзапускает команду в течение указанной продолжительности, которая здесь составляет 3600секунд(sявляется единицей времени по умолчанию ). Если тайм-аут достигнут, timeoutзавершает работу со статусом 124; в противном случае он завершается со статусом выполняемой команды.

inotifywaitожидает изменений в каталоге dir(, который $fnameдолжен быть создан в ); create— событие, которое мы наблюдаем; -qqделает это действительно довольно.

Этот тип проверки иногда применяется (, например. в других вопросах/ответах на этом сайте )как:

inotifywait -m... --format "%f" | while read -r file; do...

, где-m(режим монитора )предотвращает выход inotifywaitпосле первого совпадающего события, а правая часть конвейера получает имя файла, о котором было событие. К сожалению, этот подход не работает, если имена файлов содержат <newline>s.

Вот почему в приведенном выше коде мы не используем -mи дважды проверяем наличие $fname. Этот подход немного хрупкий, потому что$fnameможет быть создано между первым [ -e "$1" ]и первым запуском inotifywait(, а также между выполнениями inotifywaitи ). Это также не совсем подходит, если в отслеживаемом каталоге было создано много файлов, потому что каждое выполнение inotifywaitустанавливает свои собственные часы.

0
28.04.2021, 23:20

Следующий сценарий считывает FILENAMEво время проверки на наличие пустых входных данных, вычисляет END_DATEс помощью команды date, убедившись, что время настенных -часов не превышает одного часа, и проверяет, не является ли файл с именем FILENAMEсуществует каждые INTERVALсекунд. Если текущая дата:

  • равноEND_DATE:происходит последняя проверка существования файла, когда сценарий выходит из цикла while -сразу после (Без ожидания 300 секунд ).
  • превышаетEND_DATE:цикл while -прерывается без проверки существования файла.
#!/usr/bin/env bash

echo -n "Enter file name to monitor: "

read FILENAME

if [ -z "${FILENAME}" ]
then
    echo -e "\nError: Filename is empty!\nExiting..."
    exit 1
fi

END_DATE=$(date --date='next hour' '+%s')
INTERVAL=300

FOUND="false"
while :
do
    CURRENT_DATE="$(date '+%s')"
    if [ "${CURRENT_DATE}" -gt "${END_DATE}" ]
    then
        break
    elif [ "${CURRENT_DATE}" -eq "${END_DATE}" ]
    then
        INTERVAL='0.1'   # Allow for one last check
    fi

    if [ -e "${FILENAME}" ]
    then
        FOUND="true"
        break
    fi
    sleep "${INTERVAL}"
done

if [ "${FOUND}" == "true" ]
then
    echo "${FILENAME} is present"
else
    echo "Time is Over"
fi
0
28.04.2021, 23:20

Теги

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