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ă ecou
s (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?