
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