Lösung für das Problem, dass die Umleitung der Crontab-Ausgabe unter Linux nicht wirksam wird

Lösung für das Problem, dass die Umleitung der Crontab-Ausgabe unter Linux nicht wirksam wird

Frage

Unter LINUX werden periodische Aufgaben normalerweise vom Cron-Daemon-Prozess [ps -ef | grep cron] ausgeführt. Cron liest eine oder mehrere Konfigurationsdateien, die Befehlszeilen und die Zeiten enthalten, zu denen sie aufgerufen werden.

Die Cron-Konfigurationsdatei heißt „crontab“, die Abkürzung für „Cron Table“.

Vor kurzem wurde eine geplante Aufgabe zu crontab hinzugefügt. Nach der Ausführung der Aufgabe erfolgt standardmäßig eine normale Ausgabe. Um sicherzustellen, dass die Ausnahmeinformationen während der Aufgabenausführung auch erfasst werden können und die Problemlokalisierung erleichtert wird, habe ich einen solchen Befehl in crontab geschrieben:

01 09 * * * cd /opdir/test/ && ./test.sh &>>test.log

Der obige Befehl ist sehr einfach zu verstehen. Er führt das Skript test.sh jeden Tag um 9:01 aus und leitet die Standardfehlerausgabe und die Standardausgabe des Skripts in die Datei test.log um. Schließlich stellte sich heraus, dass das Skript normal ausgeführt wurde, die Protokolldatei test.log jedoch keinen Inhalt enthielt.

Um dieses Problem zu lösen und zu erklären, stellen wir zunächst kurz das Problem der Umleitung im Linux-System vor.

Konzept

Linux:

1: gibt die Standardausgabe (stdout) an, die standardmäßig auf dem Bildschirm ausgegeben wird

2: bezeichnet die Standardfehlerausgabe (stderr), die standardmäßig auf dem Bildschirm ausgegeben wird

Normalerweise verwenden wir häufig die folgende Methode, um die Ergebnisse der Skriptausführung umzuleiten:

bash test.sh >test.out //Die Standardausgabe des Skripts wird in die Datei test.out geschrieben und die Standardfehlerausgabe direkt auf dem Bildschirm gedruckt. Entspricht: bash test.sh 1>test.out
bash test.sh >test.out 2>&1 //Sowohl die Standardausgabe als auch die Standardfehler werden in test.out geschrieben und überschreiben sich nicht gegenseitig, was bash test.sh &>test.out entspricht
bash test.sh >test.out 2>test.out //Sowohl die Standardausgabe als auch die Standardfehlerausgabe werden in test.out geschrieben, was sich gegenseitig überschreiben kann. Es wird nicht empfohlen, bash test.sh &>test.out zu verwenden //Entspricht der zweiten Methode

Vergleichen Sie die obigen Effekte:

Der erste Typ: Fehlerausgabe erfolgt auf dem Bildschirm, normale Ausgabe erfolgt in der Datei test.out

root@mengalong:~/opdir/mengalong/t/t# cat test.sh
#!/bin/bash
T
Datum

root@mengalong:~/opdir/mengalong/t/t# bash test.sh >test.out
test.sh: Zeile 2: t: Befehl nicht gefunden
root@mengalong:~/opdir/mengalong/t/t# cat test.out
Mittwoch, 31. Oktober 2018, 11:07:24 CST

Der zweite Typ: Sowohl die Fehlerausgabe als auch die normale Ausgabe werden in die Datei test.out umgeleitet

root@mengalong:~/opdir/mengalong/t/t# bash test.sh >test.out 2>&1
root@mengalong:~/opdir/mengalong/t/t# cat test.out
test.sh: Zeile 2: t: Befehl nicht gefunden
Mittwoch, 31. Oktober 2018, 11:09:02 CST

Der dritte Typ: Fehlerausgabe und normale Ausgabe überdecken sich gegenseitig

root@mengalong:~/opdir/mengalong/t/t# bash test.sh >test.out 2>test.out
root@mengalong:~/opdir/mengalong/t/t# cat test.out
Mittwoch, 31. Oktober 2018, 11:10:36 CST
nicht gefunden

Viertens, Sonderfall, vergleichen Sie den Unterschied zwischen bash test.sh 2>&1 >test.out und bash test.sh >test.out 2>&1:

root@mengalong:~/opdir/mengalong/t/t# bash test.sh 2>&1 >test.out
test.sh: Zeile 2: t: Befehl nicht gefunden
root@mengalong:~/opdir/mengalong/t/t# cat test.out
Mittwoch, 31. Oktober 2018, 11:12:13 CST

Hier setzen wir einfach 2>&1 vor >test.out, aber das Ergebnis ist nicht das erwartete. Sowohl die Fehler- als auch die normale Ausgabe gehen in die Datei test.out. Dies liegt daran, dass im Befehl bash test.sh 2>&1 >test.out 2>&1 die Fehlerausgabe nur an die Standardausgabe umleitet und der Standardwert der Standardausgabe zu diesem Zeitpunkt der Bildschirm ist. Dies ist also tatsächlich gleichbedeutend damit, dass die Standardfehlerausgabe auf den Bildschirm statt in die Datei umgeleitet wird. Daher muss die Umleitungsreihenfolge berücksichtigt werden.

Problemlösung

Schauen wir uns als Nächstes die Crontab-Aufgabe an, die ich geschrieben habe:

01 09 * * * cd /opdir/test/ && ./test.sh &>>test.log

Gemäß der obigen konzeptionellen Analyse sollte diese Schreibmethode äquivalent zu ./test.sh >test.log 2>&1 sein. Die Ausgabe der Skriptausführung und die Standardfehlerausgabe werden alle nach test.log umgeleitet. Tatsächlich ist es aber so, dass die Datei test.log nichts enthält.

Dies liegt daran, dass die von crontab verwendete Standard-Shell-Umgebung /bin/sh ist und /bin/sh die Umleitungsmethode von &>>test.log nicht unterstützt. Daher sehen wir, dass test.log keinen Inhalt enthält.

Daher besteht die Lösung des Problems darin, die Umleitungsmethode von Crontab zu ändern:

01 09 * * * cd /opdir/test/ && ./test.sh >>test.log 2>&1

Ein Ratschlag

Wenn die Skriptausgabe während der Crontab-Ausführung nicht umgeleitet wird, wird standardmäßig eine E-Mail an den Systembenutzer gesendet. Der E-Mail-Inhalt wird im Allgemeinen in /var/mail/$user gespeichert. Wenn er nicht bereinigt wird, wird die Stammpartition des Servers voll, was schließlich dazu führt, dass sich der Computer nicht mehr anmelden kann. Daher lautet der empfohlene Crontab-Befehl wie folgt:

01 09 * * * cd /opdir/test/ && ./test.sh >>test.log 2>&1 </dev/null &

Insbesondere wird am Ende </dev/null & hinzugefügt. Ich werde die Bedeutung davon nicht im Detail erklären. Wenn Sie interessiert sind, können Sie es selbst analysieren.

Zusammenfassen

Das Obige ist der vollständige Inhalt dieses Artikels. Ich hoffe, dass der Inhalt dieses Artikels einen gewissen Lernwert für Ihr Studium oder Ihre Arbeit hat. Wenn Sie Fragen haben, können Sie eine Nachricht hinterlassen. Vielen Dank für Ihre Unterstützung von 123WORDPRESS.COM.

Das könnte Sie auch interessieren:
  • Konfigurationsmethode für geplante Linux-Crontab-Aufgaben (ausführliche Erklärung)
  • So verwenden Sie Linux Crontab, um regelmäßig PHP-Skripte auszuführen
  • Linux verwendet crontab, um PHP-Ausführungsplan-Timing-Aufgaben zu implementieren
  • Linux Crontab Beispielanalyse
  • MySQL-geplante Sicherung mit Crontab-geplantem Sicherungsbeispiel unter Linux
  • So verwenden Sie crontab, um eine geplante Aufgabe einmal pro Sekunde in Linux auszuführen
  • Wie man Aufgaben unter Linux regelmäßig ausführt und Anleitungen zur Verwendung von crontab (gesammelt und sortiert)
  • Detaillierte Erläuterung der Verwendung von Python Crontab zum Einrichten geplanter Linux-Aufgaben
  • Detaillierte Erläuterung der Linux-Ein- und Ausgabeumleitung
  • Detaillierte Anweisungen zur Verwendung der Linux-Ein- und Ausgabeumleitung

<<:  Werfen wir einen Blick auf die Vorkompilierung von JavaScript (Zusammenfassung)

>>:  Lösung für den Fehler beim Importieren von MySQL Big Data in Navicat

Artikel empfehlen

jQuery implementiert alle Warenkorbfunktionen

Inhaltsverzeichnis 1. Alles auswählen 2. Erhöhen ...

Das Balkendiagramm von Vue + Echart realisiert Statistiken zu Epidemiedaten

Inhaltsverzeichnis 1. Installieren Sie zuerst ech...

Detaillierte Erklärung der CSS3-Textschatteneigenschaft Textschatten

Textschatten-Textschatten-Eigenschaftseffekte: 1....

Einführung und Analyse von drei Binlog-Formaten in MySQL

eins. Einführung in das Mysql Binlog-Format Das M...

Einführung und Verwendungszusammenfassung der negativen Margenfunktion

Bereits in den CSS2-Empfehlungen von 1998 verschwa...

Hexadezimale Farbcodes (vollständig)

Rot und Pink und ihre Hexadezimalcodes. #990033 #...

Detailliertes Tutorial zum Herunterladen und Installieren von VMware Workstation

Virtuelle Maschinen sind eine sehr praktische Tes...

Implementierungscode der HTML-Floating-Promptbox-Funktion

Allgemeine Formulareingabeaufforderungen belegen ...

Linux-Betrieb und -Wartung – Tutorial zur grundlegenden Datenträgerverwaltung

1. Festplattenpartition: 2. fdisk-Partition Wenn ...

Zusammenfassung häufig verwendeter Leistungstestskripte für VPS-Server

Hier ist ein allgemeines Ein-Klick-Leistungstests...

Mehrere Möglichkeiten zum Senden von HTML-Formularen_PowerNode Java Academy

Methode 1: Absenden über den Absenden-Button <...

Erläuterung der Lösung zur mobilen H5-Bildgenerierung in JavaScript

Derzeit gibt es viele Betriebsaktivitäten für öff...

Warum brauchen wir Map, wenn wir in JavaScript bereits Object haben?

Inhaltsverzeichnis 1. Behandeln Sie Objekte nicht...