Какую базу данных используют `updatedb` и `locate`?

Чтобы записать stderr на экран и записать ОБЕ stderr и stdout в файл - И чтобы строки для stderr и stdout выходили в той же последовательности, что и если бы оба были записаны на экран:

Оказывается, сложная проблема, особенно часть, касающаяся «одинаковой последовательности», которую можно было бы ожидать, если бы вы просто записали их на экран. Проще говоря: запишите каждую в отдельный файл, сделайте некоторую магию фонового процесса, чтобы пометить каждую строку (в каждом файле) с точным временем создания строки, а затем: "tail --follow" файл stderr на экран , но чтобы увидеть ОБЕ "stderr" и "stdout" вместе - по порядку - отсортируйте два файла (с метками точного времени на каждой строке) вместе.

Код:

# Set the location of output and the "first name" of the log file(s)
pth=$HOME
ffn=my_log_filename_with_no_extension
date >>$pth/$ffn.out
date >>$pth/$ffn.err
# Start background processes to handle 2 files, by rewriting each one line-by-line as each line is added, putting a label at front of line
tail -f $pth/$ffn.out | perl -nle 'use Time::HiRes qw(time);print substr(time."0000",0,16)."|1|".$_' >>$pth/$ffn.out.txt &
tail -f $pth/$ffn.err | perl -nle 'use Time::HiRes qw(time);print substr(time."0000",0,16)."|2|".$_' >>$pth/$ffn.err.txt &
sleep 1
# Remember the process id of each of 2 background processes
export idout=`ps -ef | grep "tail -f $pth/$ffn.out" | grep -v 'grep' | perl -pe 's/\s+/\t/g' | cut -f2`
export iderr=`ps -ef | grep "tail -f $pth/$ffn.err" | grep -v 'grep' | perl -pe 's/\s+/\t/g' | cut -f2`
# Run the command, sending stdout to one file, and stderr to a 2nd file
bash mycommand.sh 1>>$pth/$ffn.out 2>>$pth/$ffn.err
# Remember the exit code of the command
myexit=$?
# Kill the two background processes
ps -ef | perl -lne 'print if m/^\S+\s+$ENV{"idout"}/'
echo kill $idout
kill $idout
ps -ef | perl -lne 'print if m/^\S+\s+$ENV{"iderr"}/'
echo kill $iderr
kill $iderr
date
echo "Exit code: $myexit for '$listname', list item# '$ix', bookcode '$bookcode'"

Да, это кажется сложным, и в результате получается 4 выходных файла (2 из которых вы можете удалить).Похоже, что это сложная проблема, поэтому потребовалось несколько механизмов.

В конце, чтобы увидеть результаты ОБЕИХ stdout и stderr в ожидаемой последовательности, выполните следующее:

cat $pth/$ffn.out.txt $pth/$ffn.err.txt | sort

Единственная причина, по которой последовательность, по крайней мере, очень близка к той, которая была бы, если бы и stdout, и stderr Просто перешел на экран: Каждая строка помечена меткой времени с точностью до миллисекунды.

Чтобы увидеть stderr на экране по мере продвижения процесса, используйте это:

tail -f $pth/$ffn.out

Надежда, которая поможет кому-то, кто прибыл сюда спустя много времени после того, как был задан исходный вопрос.

25
20.07.2017, 19:06
1 ответ

Кажется, это обычный файл структур C, написанный/прочитанный с использованием Gnu LibC. Макросы OBSTACKS

См. источники

https://github.com/msekletar/mlocate/blob/master/src/updatedb.c#L720

https://github.com/msekletar/mlocate/blob/master/src/locate.c#L413

Вы можете получить что-то подобное с помощью

find / -xdev -type f -not -path \*\.git\/\* | gzip -9 > /tmp/files.gz
zgrep file_i_want /tmp/files.gz
13
27.01.2020, 19:40

Теги

Похожие вопросы