Судя по вашему собственному вопросу, время записи USB вдвое меньше времени чтения при оптимальных условиях. Кажется, вы не учитываете буферы, и эти скорости чрезвычайно выгодны по сравнению с реальной производительностью устройства.
Так что попробуй:
time $ (sudo dd if=/dev/urandom of=/home/host/mnt/testfile2 bs=1M count=1000)
time $ (sudo dd if=/dev/urandom of=/home/host/mnt/testfile2 bs=1M count=1000 & sync)
И посмотрите на время второй операции.
Выполнение параллельных операций также не подходит для этой среды и приведет к ее остановке. Срок службы такого устройства при таком использовании будет коротким, такой носитель не предназначен для такого использования.
Обычно гипервизорам требуется много операций ввода-вывода, они могут постоянно сохранять образ виртуальной машины в дополнение к операциям ввода-вывода виртуальных машин, а некоторые технологии также делают регулярные моментальные снимки.
Короче говоря, вы пытаетесь использовать его не для того, для чего он был разработан, он не будет работать независимо от того, как вы пытаетесь его оптимизировать.
ПС. У меня также есть USB-ручка «той же» модели, за исключением меньшей емкости, и эта модель — очень плохой выбор, они медленные при обычном использовании. Спецификации производителя выглядят хорошо на бумаге, однако они часто представляют собой операции синхронизации с объемами данных, которые помещаются в их буфер ОЗУ.
ПС2. Вы говорите, что это устройство USB 3.1, но не сообщаете нам технологию вашего устройства.
Попробуйте:
value=$(perl -e 'print qx/cat newdata.txt/;')
Это использует " -e" для определения Perl-кода, который должен выполняться компилятором.
$ ()позволяет записывать вывод команды и назначать его переменной оболочки.
Это задача XY . Чтобы присвоить содержимое файла newdata.txt
переменной lines
, используйте:
lines="$(cat newdata.txt)"
Но зачем вам присваивать содержимое newdata.txt
переменной?
Желаемый результат — объект JSON с полем value
, значением которого является содержимое newdata.txt
. Содержимое newdata.txt
представляет собой обычный текст, а не JSON, поэтому повторение {"value", $(cat newdata.txt)}
или эквивалентное {"value", $lines}
в jq.
не будет работать, поскольку jq
ожидает чтения корректного JSON.
Актуальный вопрос::как преобразовать строки обычного текста в JSON?
jq
может анализировать строки произвольного ввода в поток строк JSON, используя опции -R
, --raw-input
. Чтобы разобрать все входные строки сразу, используйте опции -s
, --slurp
. После этого ввод доступен для обычной jq
потоковой обработки, поэтому:
jq -sR '{"value",.}' newdata.txt
даст нужный объект JSON.
Отдельно стоит отметить, что echo "$(tail -n10 newdata.txt)" > newdata.txt
периодически дает сбой. У >newdata.txt
есть все шансы урезать newdata.txt
до 0 байт, прежде чем tail
получит шанс прочитать свои последние 10 строк. Вы можете использовать sponge
, чтобы решить эту проблему, но смотрите ниже.
Кроме того, почему echo
? tail -n 10
уже выводится на стандартный вывод, поэтому нет необходимости перехватывать его вывод в строке, просто чтобы echo
снова вывести его на стандартный вывод.
Сочетая все это, решение в одну -строку будет:
tail -n 10 olddata.txt | tee newdata.txt | jq -sR '{"value",.}' &&
mv newdata.txt olddata.txt
bash
имеет все возможности других языков программирования, такие как переменные и строки, но более продуктивно думать о нем как о потоковом процессоре, который читает со стандартного ввода и записывает на стандартный вывод.
Я понял. Публикую ответ, кому нужно. Я добавляю данные в файл с именем newdata.txt следующим образом:echo "$(tail -n10 newdata.txt)" > newdata.txt;
Затем я просто скопировал файл в переменную с именем value :value="$ (cat newdata.txt )"
После выполнения echo "{\"Values\":[$value]}" | jq.
я получаю объект JSON.
Это работает только при наличии запятой в конце каждой строки, кроме последней строки.
Я не уверен, что это надежный и правильный способ сделать это. Но это сработало для моей проблемы.