Gửi thiết bị xuất chuẩn và thiết bị xuất chuẩn vào tệp, syslog và thiết bị đầu cuối


8

Đối với một số máy đám mây tôi đang khởi chạy, tôi đang cố gắng đăng nhập vào một tệp cụ thể, nhật ký hệ thống và thiết bị đầu cuối / bảng điều khiển.

Ở đầu tập lệnh thiết lập máy / đám mây của tôi, tôi có các phần sau:

#!/bin/bash
exec &> >(tee "/tmp/box-setup.log" | logger -t box-setup)
apt-get install -y some-package

Điều này hoạt động rất tốt trong việc gửi đầu ra đến một tệp và nhật ký hệ thống, nhưng nó không dẫn đến đầu ra đến thiết bị đầu cuối.

Nói chung, không có đầu ra đầu cuối không phải là một vấn đề lớn, ngoại trừ khi tôi gỡ lỗi từ bảng điều khiển từ xa. Khi điều đó xảy ra, tôi hoàn toàn bị mù vì bảng điều khiển trống khi tập lệnh bash thực thi.

Có cách nào đơn giản bằng cách sử dụng bashchuyển hướng hoặc bất cứ điều gì để chuyển tất cả đầu ra (đầu ra tiêu chuẩn cùng với lỗi tiêu chuẩn) sang một tệp, syslog và thiết bị đầu cuối đồng thời không?

Tôi đang chạy Ubuntu 16.04.

Câu trả lời:


8

Thêm một sự thay thế quá trình lồng nhau và một cái khác teetrong đó như:

exec &> >(tee >(tee "/tmp/box-setup.log" | logger -t box-setup))

Cái đầu tiên teetrong sự thay thế quy trình chính sẽ gửi STDOUT / STDERR đến thiết bị đầu cuối và cũng đến sự thay thế quy trình lồng nhau, teebên trong lưu nội dung trong tệp /tmp/box-setup.logvà đường ống cũng được sử dụng để gửi đầu ra cho loggerSTDIN.


Tôi đang bối rối về nhiều lời mời tee, nó sẽ rẽ vào n luồng, điều này có nên tương đương không? exec &> >(tee /tmp/box-setup.log >(logger -t box-setup))
ThorSummoner

3

Tôi hoàn toàn bị mù vì bảng điều khiển trống khi tập lệnh bash thực thi.

Bạn có thể muốn giải quyết vấn đề đó theo một cách khác: chạy tập lệnh bash của bạn ở chế độ nền và chạy less /tmp/box-setup.logvà nhấn F để tiếp tục cập nhật màn hình khi các dòng được thêm vào tệp mà nó đang xem (như tail -f).

Nếu việc chạy tập lệnh ở chế độ nền là một vấn đề, hãy sử dụng tmuxhoặc screenđể có nhiều phiên được ghép vào một kết nối ssh. Sử dụng lesslệnh tương tự trong shell khác.


Vấn đề ban đầu:

teecó thể sao chép vào nhiều điểm đến. Tạo một trong số chúng là thiết bị đầu cuối, sử dụng /dev/ttytệp đặc biệt. Tôi nghĩ rằng nó luôn đề cập đến tty kiểm soát của quá trình hiện tại. Hoặc có lẽ tốt hơn, /dev/stderrtee, stderr vẫn được kết nối với stderr của shell. (Điều này cho phép bạn tắt tiếng tập lệnh với &> / dev / null).

exec &> >(tee /dev/stderr "/tmp/box-setup.log" | logger -t box-setup)

BTW, điều này tương đương nhưng hiệu quả hơn (tee /dev/stderr | tee "/tmp/box-setup.log" | logger ...).

Có thể sử dụng một số nhân bản mô tả tệp để cung cấp cho teethiết bị xuất chuẩn của tập lệnh gốc, thay vì thiết bị xuất chuẩn.


1

Đơn giản chỉ cần thêm /dev/stderr(sự lựa chọn của bạn) làm đầu ra tee.

exec &> >(tee /dev/stderr "/tmp/box-setup.log" | logger -t box-setup)

Đầu ra tiêu chuẩn và lỗi tiêu chuẩn sẽ được hợp nhất. Không có cách nào để giữ chúng tách biệt nếu bạn muốn giữ trật tự của chúng, điều thường được mong muốn. Không thành vấn đề nếu cả hai cùng đi đến một nơi (ví dụ như thiết bị đầu cuối).


teeStdout là đường ống để logger, không phải là thiết bị đầu cuối. Đó là stderrvào thời điểm đó vẫn là thiết bị đầu cuối, dựa trên exec &> >(tee /dev/stderr > /dev/null)làm việc như mong đợi trong một vỏ tương tác. stderrcó vẻ như là một ý tưởng tốt hơn ý tưởng của tôi /dev/tty, vì nó cho phép bạn dễ dàng đóng tập lệnh bằng chuyển hướng nếu bạn muốn.
Peter Cordes
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.