Оп здесь.
Решение, которое я придумал :, это скрипт с именемburst
:
inotifywait -e moved_to "$monitored_dir" -m \
| burst 2 'echo run post-upload'
Скрипт burst
:
#!/bin/bash
help() {
>&2 echo "Usage: $0 <interval> <command>"
}
set -e
trap help EXIT
interval=${1:?missing interval}; shift
: ${1:?missing command}
trap - EXIT
set +e
exec 3> >(sed "s/^/burst: /" >&2)
while read line; do
echo "$line" >&3
test -n "$!" && kill -term $! 2>/dev/null
(sleep $interval && $SHELL -c "$*") &
done
По сути, это создание подоболочки, которая ожидает определенное время перед запуском фактической команды((sleep $interval && $SHELL -c "$*")
. Любая новая строка, прочитанная inotifywait
, просто уничтожит такую оболочку (, если она существует ), и создаст ее снова.
Как только набор строк завершится, оболочка сможет завершить sleep
, и команда будет выполнена.
Имеет некоторые недостатки:
Он убивает и порождает один процесс для каждой строки в стандартном вводе. Это означает, что вы хотите сначала уменьшите количество строк (, следовательно, фильтр -e moved_to
вinotifywait
). Это может не соответствовать производительности, если количество загруженных файлов достаточно большой!
Если второй пакет поступает после $interval
секунд (или передачи файла занимает это время )есть вероятность, что это убьет текущую публикацию -обновление процесс. Пока такой процесс является идемпотентным или транзакционным, это будет хорошо... так что голову.
Простой способ с использованием sed
(, но с некоторыми подводными камнями, о которых нужно знать):
sed 's/<head/your-js-text<head/'
Это вставит текст перед вашим тегом <head>
. Основная проблема, о которой нужно знать, - это как правильно "экранировать" символы в вашем javascript, которые могут быть неверно истолкованы sed
, например. одинарная кавычка и косая черта вперед/назад. Кроме того, если -ваш html-файл неправильно -сформирован и содержит более одного тега <head>
, каждый из них будет заменен.
РЕДАКТИРОВАТЬ :Если в вашем javascript много косых черт,вы можете использовать функцию sed
, которая позволяет заменить символ косой черты в команде s
. Любое из следующего также будет работать:
sed 's^<head^your-js-text<head^'
sed 's%<head%your-js-text<head%'
sed 's#<head#your-js-text<head#'