Я хочу проследить несколько файлов журнала и вывести входящие строки в один канал. Однако, делая это без особого размышления (например, tail -F
), можно получить ломаные линии: например, строки ABC\n
и XYZ\n
из двух журналов могут смешаться и стать ABXYZ\nC\n
.
Вот пример:
$ >a >b
$ (echo -n a >>a; sleep 2; echo A >>a) &
$ (echo -n b >>b; sleep 2; echo B >>b) &
$ tail -Fq a b
В идеале это производит aA\n
и bB\n
. В действительности получается что-то вроде abA\nB\n
.
Как вывести эти строки, чтобы они не перепутались?
Вот некоторые вещи, которые я пробовал
Вместо того, чтобы использовать один
tail -Fq
, я попробовал отдельные экземплярыtail
для каждого файла:$ (trap 'kill 0' EXIT; tail -F a & tail -F b & wait)
Тем не менее, я думаю, что это просто перемещает проблему из
tail
в конвейерный буфер, и проблема не решается.Используйте отдельные экземпляры и используйте
grep
для буферизации каждой строки.$ (trap 'kill 0' EXIT; tail -F a | grep -F '' & tail -F b | grep -F '' & wait)
Это похоже на работу. Однако я не уверен, насколько это долговечно. Я думаю, что он имеет те же ограничения, которые обсуждались в этом вопросе: является ли эхо атомарным при написании отдельных строк
(Кроме того, есть ли лучший способ сделать то, что здесь делает
grep -F ''
?)