Btrfs использует контрольные суммы crc32c для проверки целостности блоков. Если контрольная сумма не соответствует блоку при чтении, то читается альтернативный блок. Предполагается, что есть альтернатива (RAID1). Если этот блок также выходит из строя или нет альтернативы, возвращается EIO (ввод / вывод ошибки).
Я не знаю никакого способа автоматического обнаружения ошибок, но все ошибки записываются в системный журнал. Попробуйте dmesg | grep btrfs
. Вы должны искать что-то вроде этого:
[ 2993.114213] btrfs: sda2 checksum verify failed on 272228352 wanted 1A0FCFD3 found 119281BE level 0
[ 2993.114527] btrfs: sda2 checksum verify failed on 272228352 wanted 1A0FCFD3 found 119281BE level 0
[ 2993.114795] btrfs: sda2 checksum verify failed on 272228352 wanted 1A0FCFD3 found 119281BE level 0
[ 2993.115097] btrfs: sda2 checksum verify failed on 272228352 wanted 1A0FCFD3 found 119281BE level 0
Вы, вероятно, могли бы создать сценарий или сценарий, который просматривает журналы и регулярно уведомляет вас об ошибках. Или вы можете отфильтровать эти записи журнала и запустить действие rsyslog.
Я предполагаю, что в вашей Ubuntu установлен Python
#!/usr/bin/python3
import io
import json
import xml.etree.ElementTree
d = """<quiz>
<que>The question her</que>
<ca>text</ca>
<ia>text</ia>
<ia>text</ia>
<ia>text</ia>
</quiz>
"""
s = io.StringIO(d)
# root = xml.etree.ElementTree.parse("filename_here").getroot()
root = xml.etree.ElementTree.parse(s).getroot()
out = {}
i = 1
for child in root:
name, value = child.tag, child.text
if name == 'que':
name = 'question'
else:
name = 'answer%s' % i
i += 1
out[name] = value
print(json.dumps(out))
сохраните его и chmod
в исполняемый файл вы можете легко изменить, чтобы в качестве входных данных использовался файл, а не просто текст
РЕДАКТИРОВАТЬ Хорошо, это более полный сценарий:
#!/usr/bin/python3
import json
import sys
import xml.etree.ElementTree
def read_file(filename):
root = xml.etree.ElementTree.parse(filename).getroot()
return root
# assule we have a list of <quiz>, contained in some other element
def parse_quiz(quiz_element, out):
i = 1
tmp = {}
for child in quiz_element:
name, value = child.tag, child.text
if name == 'que':
name = 'question'
else:
name = 'answer%s' % i
i += 1
tmp[name] = value
out.append(tmp)
def parse_root(root_element, out):
for child in root_element:
if child.tag == 'quiz':
parse_quiz(child, out)
def convert_xml_to_json(filename):
root = read_file(filename)
out = []
parse_root(root, out)
print(json.dumps(out))
if __name__ == '__main__':
if len(sys.argv) > 1:
convert_xml_to_json(sys.argv[1])
else:
print("Usage: script <filename_with_xml>")
Я сделал файл со следующим, который я назвалxmltest
:
<questions>
<quiz>
<que>The question her</que>
<ca>text</ca>
<ia>text</ia>
<ia>text</ia>
<ia>text</ia>
</quiz>
<quiz>
<que>Question number 1</que>
<ca>blabla</ca>
<ia>stuff</ia>
</quiz>
</questions>
Итак, у вас есть список quiz
внутри какого-то другого контейнера.
Теперь запускаю вот так :$ chmod u+x scratch.py
, затемscratch.py filenamewithxml
Это дает мне ответ:
$./scratch4.py xmltest
[{"answer3": "text", "answer2": "text", "question": "The question her", "answer4": "text", "answer1": "text"}, {"answer2": "stuff", "question": "Question number 1", "answer1": "blabla"}]
на самом деле здесь можно обойтись даже без программирования на Python, просто используя 2 утилиты unix:
Таким образом, если ваш xml находится в file.xml
, jtm преобразует его в следующий json:
bash $ jtm file.xml
[
{
"quiz": [
{
"que": "The question her"
},
{
"ca": "text"
},
{
"ia": "text"
},
{
"ia": "text"
},
{
"ia": "text"
}
]
}
]
bash $
а затем, применив ряд преобразований JSON, можно прийти к желаемому результату:
bash $ jtm file.xml | jtc -w'<quiz>l:[1:][-2]' -ei echo { '"answer[-]"': {} }\; -i'<quiz>l:[1:]' | jtc -w'<quiz>l:[-1][:][0]' -w'<quiz>l:[-1][:]' -s | jtc -w'<quiz>l:' -w'<quiz>l:[0]' -s | jtc -w'<quiz>l: <>v' -u'"text"'
[
{
"answer1": "text",
"answer2": "text",
"answer3": "text",
"answer4": "text",
"text": "The question her"
}
]
bash $
Тем не менее, из-за того, что команда )использует сценарии оболочки (echo
, она будет медленнее, чем Python -для 5000 вопросов, я ожидаю, что она будет выполняться около минуты. (В будущей версии jtc
я планирую разрешить интерполяции даже в статически заданных JSON, чтобы для шаблонизации не требовалось скриптов внешней оболочки -, тогда операции будут выполняться молниеносно)
если вас интересует синтаксис jtc
, вы можете найти руководство пользователя здесь:https://github.com/ldn-softdev/jtc/blob/master/User%20Guide.md
Спасибо, dgan, но ваш код :1 -вывести вывод на экран не в файл json и не поддерживать кодировку = utf -8, поэтому я изменил его:
##!/usr/bin/python3
import json, codecs
import sys
import xml.etree.ElementTree
def read_file(filename):
root = xml.etree.ElementTree.parse(filename).getroot()
return root
# assule we have a list of <quiz>, contained in some other element
def parse_quiz(quiz_element, out):
i = 1
tmp = {}
for child in quiz_element:
name, value = child.tag, child.text
if name == 'que':
name = 'question'
else:
name = 'answer%s' % i
i += 1
tmp[name] = value
out.append(tmp)
def parse_root(root_element, out):
for child in root_element:
if child.tag == 'quiz':
parse_quiz(child, out)
def convert_xml_to_json(filename):
root = read_file(filename)
out = []
parse_root(root, out)
with open('data.json', 'w') as outfile:
json.dump(out, codecs.getwriter('utf-8')(outfile), sort_keys=True, ensure_ascii=False)
if __name__ == '__main__':
if len(sys.argv) > 1:
convert_xml_to_json(sys.argv[1])
else:
print("Usage: script <filename_with_xml>")
`