Различные google-perftools
пакеты не имеют необходимых Multi-Arch:
объявлений в их управляющем файле , поэтому нет возможности установить пакеты i386
и amd64
в параллельная (нехватка принудительной -их установки, что вызовет apt
много жалоб и не позволит установить или обновить любой другой пакет ).
Возможно, вы захотите отправить сообщение об ошибке с просьбой включить эту функцию. Для этого запустите reportbug libgoogle-perftools-dev
и следуйте подсказкам.
См. Как запустить 32 -битные программы на 64 -битном Debian/Ubuntu? для других способов запуска 32 -битных программ в 64 -битной системе (, предложенных Жилем).
Думаю, вы уже близки к этому, но некоторые аспекты вашего сценария кажутся -сложными.
Вы можете попробовать следующий цикл 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
)превысил границу (, указывает, что цикл истек ), или альтернативно (может быть, даже лучше ), если файл присутствует, чтобы решить, следует ли выводить сообщение «Время истекло».
Альтернативный подход, который позволяет избежать недостатков опроса (компромисса -между потреблением ресурсов для коротких циклов опроса и задержкой обнаружения изменений для длинных циклов опроса ). Плата за это заключается в том, что он опирается на инструменты, которые могут быть вам недоступны, а именно 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
устанавливает свои собственные часы.
Следующий сценарий считывает 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