Điểm:0

Cách đảm bảo đầu ra từ "tee" được hiển thị khi được sử dụng trong tập lệnh chạy dưới systemd

lá cờ vn

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ý 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 vangs (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)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?

Ginnungagap avatar
lá cờ gu
Bạn đã thử xem điều gì sẽ xảy ra nếu bạn không sử dụng `tee` và chỉ để nó vào nhật ký chưa? Bạn có nhận được đầu ra hoàn chỉnh không?
lá cờ vn
@Ginnungagap vâng, nếu tôi xóa `tee` thì tôi sẽ thấy tất cả đầu ra. Thêm cái này vào danh sách những thứ tôi đã thử trong bài viết của mình.

Đăng câu trả lời

Hầu hết mọi người không hiểu rằng việc đặt nhiều câu hỏi sẽ mở ra cơ hội học hỏi và cải thiện mối quan hệ giữa các cá nhân. Ví dụ, trong các nghiên cứu của Alison, mặc dù mọi người có thể nhớ chính xác có bao nhiêu câu hỏi đã được đặt ra trong các cuộc trò chuyện của họ, nhưng họ không trực giác nhận ra mối liên hệ giữa câu hỏi và sự yêu thích. Qua bốn nghiên cứu, trong đó những người tham gia tự tham gia vào các cuộc trò chuyện hoặc đọc bản ghi lại các cuộc trò chuyện của người khác, mọi người có xu hướng không nhận ra rằng việc đặt câu hỏi sẽ ảnh hưởng—hoặc đã ảnh hưởng—mức độ thân thiện giữa những người đối thoại.