Puncte:0

Cum să vă asigurați că rezultatul de la „tee” este afișat atunci când este utilizat într-un script rulat sub systemd

drapel vn

Am un script pe care îl execut systemd care are niște jurnale de depanare pe care aș dori să le trimit la ambele stdout (care ar trebui să ajungă în jurnalul de sistem, vizibile cu jurnalctl), precum și la un fișier jurnal de pe sistemul meu de fișiere.

De obicei, aș ajunge la tricou pentru a realiza acest lucru (scrieți în stdout și fișiere), și funcționează bine când rulez scriptul singur (văd toate jurnalele mele pe consola mea, precum și în fișierul meu jurnal), dar când îl rulez sub systemd Îmi lipsesc o grămadă de rezultate de la tricou în jurnalul de sistem (deși toate jurnalele sunt prezente în fișierul jurnal).

Am încercat câteva lucruri care nu au rezolvat problema:

  • stdbuf (după cum se sugerează Aici pentru forțarea liniei de ieșire tamponată) în my ExecStart= în fișierul meu de serviciu.
  • StandardOutput=jurnal+consola în fișierul meu de serviciu (DefaultStandardOutput este neasezat in /etc/systemd/system.conf, deci are valoarea implicită a jurnal).
  • A eliminat tricou, asa ca ecou doar scrie direct la stdout. Când fac asta eu do vezi toate jurnalele din jurnalul de sistem (dar îmi pierd fișierul jurnal). Cred că aș putea să-mi fac singur tricou cu o funcție care face două ecous (o dată la fișierul jurnal, o dată la stdout), dar asta pare un fel de hacker. Aș prefera să folosesc tricou, care există deja în acest scop...

Am reprodus această problemă pe Manjaro și Ubuntu (systemd 249 (249.4-2-manjaro) și systemd 245 (245.4-4ubuntu3.5)), dar eu nu pot reproduce-l pe Debian 11 (systemd 247 (247.3-6)). Nu văd nicio diferență flagrantă în niciuna dintre configurațiile mele de mai jos /etc/systemd între sistemul Debian funcțional și sistemul Manjaro care nu funcționează. Nu sunt sigur ce alte configurații de sistem ar putea afecta acest lucru...

Am instrucțiuni complete de reproducere Aici.

Scenariul meu

Trăiește la /tmp/tee_test.sh.

#!/bin/bash

LOGFILE=/tmp/testtee.log
echo > „$LOGFILE”
echo „îmi place plăcinta” | tee -a „$LOGFILE”

i=2
in timp ce :; do
    echo "voi mânca $i felii de pizza" | tee -a „$LOGFILE”
    ((i++))
    somn 1
Terminat

Unitatea mea de sistem

Trăiește la ~/.config/systemd/user/tee_test.service si este incarcat cu systemctl --user daemon-reload de fiecare dată când îl schimb.

[Unitate]
Descriere=Testează tee-ul sub systemd

[Serviciu]
# același rezultat cu oricare dintre următoarele două variante
ExecStart=/tmp/tee_test.sh
# ExecStart=stdbuf -i0 -o0 -e0 /tmp/tee_test.sh

# același rezultat cu sau fără acest tip
StandardOutput=jurnal+consola

[Instalare]
WantedBy=default.target

Logare în jurnalul de sistem

Vizionare cu journalctl --user -x -u tee_test.service. Văd doar un subset al jurnalelor.

20 oct 09:49:03 grinchel systemd[2678]: A început testarea tee-ului sub systemd.
ââ Subiect: O lucrare de pornire pentru unitatea UNIT sa încheiat cu succes
ââ Definit de: systemd
ââ Suport: https://forum.manjaro.org/c/support
ââ
ââ O lucrare de pornire pentru unitatea UNIT sa încheiat cu succes.
ââ
ââ Identificatorul locului de muncă este 8193.
20 oct 09:49:26 grinchel tee_test.sh[399363]: voi mânca 25 de felii de pizza
20 oct 09:49:40 grinchel tee_test.sh[400047]: voi mânca 39 de felii de pizza
20 oct 09:49:48 grinchel tee_test.sh[400430]: voi mânca 47 de felii de pizza
20 oct 09:49:49 grinchel tee_test.sh[400496]: voi mânca 48 de felii de pizza
20 oct 09:49:50 grinchel tee_test.sh[400529]: voi mânca 49 de felii de pizza
20 oct 09:49:51 grinchel tee_test.sh[400595]: voi mânca 50 de felii de pizza
20 oct 09:50:14 grinchel tee_test.sh[401790]: voi mânca 73 de felii de pizza
Oct 20 09:50:27 grinchel systemd[2678]: Oprire test teeing sub systemd...

Se conectează în fișierul jurnal

În fișierul meu jurnal văd toate jurnalele.

îmi place plăcinta
voi mânca 2 felii de pizza
voi mânca 3 felii de pizza
voi mânca 4 felii de pizza
voi mânca 5 felii de pizza
voi mânca 6 felii de pizza
Voi mânca 7 felii de pizza
[...multe linii similare au fost tăiate -- toate SUNT prezente în ordine, așa cum era de așteptat...]
Voi mânca 84 de felii de pizza
Voi mânca 85 de felii de pizza
Voi mânca 86 de felii de pizza

Ai idee ce se întâmplă aici? Cum pot să mă asigur că toate rezultatele de la tricou apare în jurnalul meu de sistem?

Ginnungagap avatar
drapel gu
Ați încercat să vă uitați la ce se întâmplă dacă nu folosiți „tee” și îl lăsați doar în jurnal? Obțineți rezultat complet atunci?
drapel vn
@Ginnungagap da, dacă scot „tee” văd toate rezultatele. Adăugând asta la lista de lucruri pe care le-am încercat în postarea mea.

Postează un răspuns

Majoritatea oamenilor nu înțeleg că a pune multe întrebări deblochează învățarea și îmbunătățește legătura interpersonală. În studiile lui Alison, de exemplu, deși oamenii își puteau aminti cu exactitate câte întrebări au fost puse în conversațiile lor, ei nu au intuit legătura dintre întrebări și apreciere. În patru studii, în care participanții au fost implicați în conversații ei înșiși sau au citit transcrieri ale conversațiilor altora, oamenii au avut tendința să nu realizeze că întrebarea ar influența – sau ar fi influențat – nivelul de prietenie dintre conversatori.