Я написал небольшой скрипт Bash, который использует инструменты inotify и интерфейс inotify. Моя проблема в том, что одна из команд в этой функции может заблокировать выполнение до его завершения. Таким образом, функция застревает.
Чтобы решить эту проблему, я хотел бы поставить в очередь обнаруженные файлы (по событию закрытия) и прочитать очередь из другой функции. Кто-нибудь знает, как это сделать в Bash?
Следующие переменные представляют собой простые строки для поиска каталогов или присвоения имен файлам.
inotifywait -mrq -e close --format %w%f /some/dir/ | while read FILE
do
NAME=$(echo $CAP)_"`date +"%F-%H-%M-%S"`.pcap"
logger -i "$FILE was just closed"
# cp "$FILE" "$DATA/$CAP/$ENV/$NAME"
rsync -avz --stats --log-file=/root/rsync.log "$FILE" "$DATA/$CAP/$ENV/$NAME" >> /root/rsync_stats.log
RESULT=$?
if [ $RESULT -eq 0 ] ; then
logger -i "Success: $FILE copied to SAN $DATA/$CAP/$ENV/$NAME, code $RESULT"
else
logger -i "Fail: $FILE copy failed to SAN for $DATA/$CAP/$ENV/$NAME, code $RESULT"
fi
rm "$FILE"
RESULT=$?
if [ $RESULT -eq 0 ] ; then
logger -i "Success: deletion successfull for $FILE, code $RESULT"
else
logger -i "Fail: deletion failed for $FILE on SSD, code $RESULT"
fi
do_something()
logger -i "$NAME was handled"
# for stdout
echo "`date`: Moved file"
done
Я копирую файлы на том SAN, который иногда имеет разное время ответа. Вот почему эта функция может зависнуть на некоторое время. Я заменил cp на Rsync, потому что мне нужна статистика пропускной способности. Cp (из coreutils), по-видимому, этого не делает.