Я хочу проследить несколько файлов журнала и вывести входящие строки в один канал. Однако, делая это без особого размышления (например, 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 ''?)
