Я написал небольшой скрипт Bash, который использует инструменты inotify и интерфейс inotify. Моя проблема заключается в том, что одна из команд в этой функции может блокировать выполнение до его завершения. Таким образом, функция застревает.inotifywait с fifo queue в Bash
Чтобы решить эту проблему, я хотел бы поставить в очередь обнаруженные файлы (по событию close) и прочитать очередь из другой функции. Кто-нибудь знает, как это сделать в 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), по-видимому, этого не делает.