Tôi đã có một kịch bản như:bash: Quá trình exec'd lực để có stdout unbuffered
#!/bin/bash
exec /usr/bin/some_binary > /tmp/my.log 2>&1
Vấn đề là some_binary
gửi tất cả các ghi chép của mình cho stdout, và đệm làm cho nó vì vậy mà tôi chỉ nhìn thấy đầu ra theo khối của một vài dòng. Điều này là khó chịu khi một cái gì đó bị mắc kẹt và tôi cần phải xem những gì dòng cuối cùng nói.
Có cách nào để làm cho stdout không bị cản trở trước khi tôi thực hiện điều đó sẽ ảnh hưởng đến some_binary để nó có đăng nhập hữu ích hơn?
(Kịch bản wrapper chỉ thiết lập một vài biến môi trường trước khi exec, do đó, một giải pháp trong perl hoặc python cũng sẽ là khả thi.)
Câu trả lời của Dennis là * chính xác * đúng. Đây là lý do tại sao. Các chương trình trên Unix sử dụng stdio C cho đầu ra sẽ đệm khi đầu ra không đi đến một thiết bị đầu cuối (tăng hiệu suất rất nhiều) trừ khi được yêu cầu không phải với 'setvbuf'; hầu như không ai làm phiền điều đó. Hệ thống 'expect' (trong đó' unbuffer' là một ứng dụng tầm thường) sử dụng phép màu đen với các thiết bị đầu cuối giả Unix (ptys) để chạy các chương trình với một thiết bị đầu cuối không phải là đầu cuối thực để chương trình gói không đệm đầu ra của nó. Đó là thông minh, nhưng được cảnh báo: hầu hết các hệ thống chỉ có một số lượng giới hạn ptys; một chương trình tự nhiên không bị chặn thì tốt hơn. –
BTW, điều này không hoạt động tốt trên Windows. Đó là bởi vì kỳ vọng trên nền tảng đó sử dụng phép thuật gỡ lỗi thay vì ma thuật đầu cuối (vì đây là một khu vực mà Windows có * rất * khác nhau). –
Cảm ơn. Tôi đã quyết định chọn cách sửa đổi 'some_binary' để làm điều đúng đắn thay vì dựa vào ma thuật đen. 'expect' là tuyệt vời, nhưng tôi không muốn nó ở đây ... – bstpierre