Giả sử tôi muốn thực hiện song song nhiều chương trình và kết hợp đầu ra của chúng thành một ống:
sh -c '
(echo qqq; echo qqq2; echo qqq3)&
(echo www; echo www2; echo www3)&
(echo eee; echo eee2; echo eee3)&
wait; wait; wait'
Cách tiếp cận shell này hoạt động tốt cho trường hợp đơn giản này, nhưng tôi hy vọng nó sẽ thất bại nếu các chương trình xuất ra nhiều dòng hơn và dài hơn theo cách được đệm, như thế này (được xây dựng):
qqq
qqwww
q2
qqq3www2
wwweee3
eee2
eee3
Một trong những giải pháp tôi được gợi ý sử dụng là tail -f
:
tail -n +0 -q -f <(echo qqq; echo qqq2; echo qqq3) <(echo www; echo www2; echo www3) <(echo eee; echo eee2; echo eee3)
, nhưng đây là tùy chọn tối ưu phụ: nó xuất dữ liệu chậm chạp, nó không chấm dứt; Tôi thấy các kết quả đầu ra không theo thứ tự "ngủ", nhưng theo thứ tự đối số trong trường hợp này:
tail -n +0 -q -f <(sleep 1; echo qqq; sleep 1; echo qqq2; echo qqq3) <(echo www; echo www2; sleep 10; echo www3) <(echo eee; sleep 4; echo eee2; echo eee3) | cat
Tôi đã thực hiện một chương trình nhỏ đặc biệt cho việc này, nhưng tin rằng nên có một số cách tốt để làm điều đó.
Làm thế nào để làm điều đó bằng cách sử dụng các công cụ tiêu chuẩn (và không có tail -f
bất lợi)?
syslog
...
syslog
không phải cho nhật ký, nhưng cho một cái gì đó tùy chỉnh được coi là OK?
-s
tùy chọn cho đuôi. ví dụ: tail -f -s .1 file
sẽ giảm độ trễ vòng lặp xuống còn 1 giây so với 1 giây mặc định.