systemd StandardOutput in eine Datei _und_ ins Journal?

systemd StandardOutput in eine Datei _und_ ins Journal?

Ich führe regelmäßig ein lang laufendes (~5 Tage) Datenverarbeitungsprogramm aus. Ich verwende Ubuntu und führe den Befehl mit einer vorübergehenden systemd-Aufgabe über aus systemd-run --unit data_import /path/to/my-script.sh. Es funktioniert gut. Ich kann mir die Protokollierungs-Standardausgabe des Skripts mit ansehen journalctl -u data_import.service.

Ich möchte, dass die Standardausgabe (& Standardausgabe) aus dem Skript in einer Datei sowie im systemd-Journal gespeichert wird. Ich sehe, dass systemd-run --unit data_import -p "StandardOutput=file:/path/my-logging-file.txt …die Standardausgabe in dieser Datei gespeichert wird. Es erfolgt jedoch keine Protokollierung im Journald. Ich habe versucht, das Argument zweimal anzugeben systemd-run -p "StandardOutput=file:/path/my-logging-file.txt" -p "StandardOutput=journal" …, aber das hat nicht funktioniert.

Ist es mit systemd möglich, die Standardausgabe in eine Datei zu protokollieren?Undzum systemd-Journal? (ebenso für stderr?)

Ubuntu 18.04 und 20.04, systemd v250 oder v245 usw.

Antwort1

Ich denke, wir können nur einen Hinweis findenhttps://www.freedesktop.org/software/systemd/man/systemd.exec.html#StandardOutput=was helfen könnte (achten Sie aufNimmt einen vonZeichenfolge).

Steuert, womit der Dateideskriptor 1 (stdout) der ausgeführten Prozesse verbunden ist.Nimmt einen vonerben, null, tty, Journal, kmsg, Journal+Konsole, kmsg+Konsole, Datei:Pfad, anhängen:Pfad, abschneiden:Pfad, Socket oder fd:Name.

Wir können jedoch den standardmäßigen Standardausgabetyp ändern.

Antwort2

Haben Sie versucht, direkt in Ihrem Skript eine Protokolldatei zu erstellen und die Informationen bei Bedarf hinzuzufügen? Ich weiß, dass das ziemlich offensichtlich ist, aber ich bin gespannt, ob es funktioniert.

Zum Beispiel mit Bash, direkt in Ihrem Skript:

# Declaration
LOG=/var/log/your_script_log.log
# Or with a date 
TODAY=$(date +%Y-%m-%d)
LOG=/var/log/your_script_log-$(TODAY).log
...
# Beginning of main script
echo -e $TODAY > $LOG
...
# Every time needed during the script
if [[ $state == *"stopped"* ]];then
    echo "A very important message." >> $LOG
...

Bei einem solchen System müssen Sie ein Logrotate konfigurieren, um Hunderte von Protokollen nach einigen Monaten zu vermeiden.

Antwort3

@Amandasaurus Okay, ich verstehe. Dann empfehle ich Ihnen, eine Servicedatei unter "/etc/systemd/system/[Der Name Ihres Skripts].service" zu erstellen und die erforderlichen Mindestinformationen hinzuzufügen:

[Unit]
Description=*The name of your script*

[Service]
ExecStart=/path/to/my-script.sh
ExecStop=/bin/kill $MAINPID
KillMode=process
Type=simple
StandardOutput=/path_to_log/service.log
StandardError=/path_to_log/service_error.log

[Install]
WantedBy=multi-user.target

Konfigurieren Sie dann ein Logrotate oder fügen Sie dem StandardOutput-Argument „append“ hinzu. Führen Sie danach Folgendes aus:

systemctl daemon-reload
systemctl start *The name of your service*

So aktivieren Sie den Start beim Booten Ihres Dienstes:

systemctl enable *The name of your service*

Quelle des Protokollarguments in der Servicedatei:Hier

verwandte Informationen