Tôi có một tập lệnh mà tôi đang chạy hệ thống
trong đó có một số nhật ký gỡ lỗi mà tôi muốn gửi tới cả hai thiết bị xuất chuẩn (sẽ kết thúc trong nhật ký hệ thống, có thể xem được bằng tạp chí
) cũng như tệp nhật ký trên hệ thống tệp của tôi.
Thông thường tôi sẽ tiếp cận phát bóng
để thực hiện điều này (ghi vào thiết bị xuất chuẩn và tệp) và nó hoạt động tốt khi tôi tự chạy tập lệnh (tôi thấy tất cả nhật ký của mình trên bảng điều khiển cũng như trong tệp nhật ký của mình), nhưng khi tôi chạy nó dưới hệ thống
Tôi đang thiếu một loạt các đầu ra từ phát bóng
trong nhật ký hệ thống (mặc dù tất cả các nhật ký là có trong tệp nhật ký).
Tôi đã thử một số cách không giải quyết được vấn đề:
stdbuf
(như đề xuất đây để buộc đầu ra được đệm dòng) trong tôi ExecStart=
trong tập tin dịch vụ của tôi.
StandardOutput=tạp chí+bảng điều khiển
trong tệp dịch vụ của tôi (Đầu ra tiêu chuẩn mặc định
không được đặt trong /etc/systemd/system.conf
, vì vậy nó có giá trị mặc định là tạp chí
).
- Di chuyển
phát bóng
, nên tiếng vang
chỉ cần ghi trực tiếp vào thiết bị xuất chuẩn. Khi tôi làm điều này tôi làm xem tất cả nhật ký trong nhật ký hệ thống (nhưng tôi bị mất tệp nhật ký của mình). Tôi đoán tôi có thể làm của riêng tôi phát bóng
với một chức năng mà làm hai tiếng vang
s (một lần vào tệp nhật ký, một lần vào thiết bị xuất chuẩn), nhưng điều đó có vẻ hơi khó hiểu. tôi muốn sử dụng phát bóng
, đã tồn tại cho mục đích này...
Tôi đã sao chép vấn đề này trên Manjaro và Ubuntu (systemd 249 (249.4-2-manjaro)
và systemd 245 (245.4-4ubuntu3.5)
), nhưng tôi không thể sao chép nó trên Debian 11 (hệ thống 247 (247.3-6)
). Tôi không thấy bất kỳ sự khác biệt rõ ràng nào trong bất kỳ cấu hình nào của mình trong /etc/systemd
giữa hệ thống Debian đang hoạt động và hệ thống Manjaro không hoạt động. Tôi không chắc cấu hình hệ thống nào khác có thể ảnh hưởng đến điều này...
Tôi có đầy đủ hướng dẫn repro trên đây.
kịch bản của tôi
Sống tại /tmp/tee_test.sh
.
#!/bin/bash
LOGFILE=/tmp/testtee.log
tiếng vang > "$LOGFILE"
tiếng vang "tôi thích bánh" | tee -a "$LOGFILE"
tôi=2
trong khi :; làm
echo "tôi sẽ ăn $i miếng pizza" | tee -a "$LOGFILE"
((tôi ++))
ngủ 1
xong
Đơn vị systemd của tôi
Sống tại ~/.config/systemd/user/tee_test.service
và được nạp với systemctl --user daemon-tải lại
mỗi lần tôi thay đổi nó.
[Đơn vị]
Mô tả=Thử phát bóng dưới systemd
[Dịch vụ]
# kết quả tương tự với một trong hai biến thể sau
ExecStart=/tmp/tee_test.sh
# ExecStart=stdbuf -i0 -o0 -e0 /tmp/tee_test.sh
# cùng một kết quả dù có hay không có anh chàng này
StandardOutput=tạp chí+bảng điều khiển
[Cài đặt]
WantedBy=default.target
Nhật ký trong nhật ký hệ thống
xem với tạp chí --user -x -u tee_test.service
. Tôi chỉ thấy một tập hợp con của nhật ký.
Ngày 20 tháng 10 09:49:03 grinchel systemd[2678]: Bắt đầu Thử nghiệm phát bóng dưới systemd.
ââ Chủ đề: Công việc bắt đầu cho đơn vị UNIT đã kết thúc thành công
ââ Được xác định bởi: systemd
ââ Hỗ trợ: https://forum.manjaro.org/c/support
ââ
ââ Công việc bắt đầu cho đơn vị UNIT đã kết thúc thành công.
ââ
ââ Số nhận dạng công việc là 8193.
20 tháng 10 09:49:26 grinchel tee_test.sh[399363]: tôi sẽ ăn 25 lát pizza
Ngày 20 tháng 10 09:49:40 grinchel tee_test.sh[400047]: tôi sẽ ăn 39 lát pizza
20 tháng 10 09:49:48 grinchel tee_test.sh[400430]: tôi sẽ ăn 47 lát pizza
20 tháng 10 09:49:49 grinchel tee_test.sh[400496]: tôi sẽ ăn 48 lát pizza
Ngày 20 tháng 10 09:49:50 grinchel tee_test.sh[400529]: tôi sẽ ăn 49 lát pizza
20 tháng 10 09:49:51 grinchel tee_test.sh[400595]: tôi sẽ ăn 50 lát pizza
Ngày 20 tháng 10 09:50:14 grinchel tee_test.sh[401790]: tôi sẽ ăn 73 lát pizza
Ngày 20 tháng 10 09:50:27 grinchel systemd[2678]: Dừng thử nghiệm phát bóng dưới systemd...
Đăng nhập vào tệp nhật ký
Trong tệp nhật ký của tôi, tôi thấy tất cả các nhật ký.
tôi thích bánh
tôi sẽ ăn 2 lát bánh pizza
tôi sẽ ăn 3 lát bánh pizza
tôi sẽ ăn 4 lát bánh pizza
tôi sẽ ăn 5 lát bánh pizza
tôi sẽ ăn 6 lát bánh pizza
tôi sẽ ăn 7 lát bánh pizza
[...nhiều dòng giống nhau bị cắt - tất cả chúng đều có mặt theo thứ tự như mong đợi...]
tôi sẽ ăn 84 lát bánh pizza
tôi sẽ ăn 85 lát bánh pizza
tôi sẽ ăn 86 lát bánh pizza
Bất kỳ ý tưởng những gì đang xảy ra ở đây? Làm cách nào tôi có thể đảm bảo rằng tất cả đầu ra từ phát bóng
xuất hiện trong tạp chí hệ thống của tôi?