2012-04-04 7 views
5

Wir haben Skripte der Natur folgt zusammen (in cron)Gibt es einen Weg in einem Shell-Skript, um herauszufinden, wohin seine Ausgabe umgeleitet wird?

someScript.sh > /tmp/cronlog/somescript.$(date +%Y%m%d).log 2>&1

Jetzt gibt es eine Möglichkeit, durch die mit in someScript.sh ich herausfinden kann, wie die Ausgabe in zu gegangen ist-Datei?

Das Skript sendet eine E-Mail mit einer Zusammenfassung. Zur gleichen Zeit möchte ich erwähnen, dass Details in so und so Ausgabedatei - mit in der E-Mail gefunden werden konnten.

Ich bin bewusst das Konstrukt if [ -t 1 ] zu erkennen, Stdout usw., aber wie der Name der Ausgabedatei zu bekommen? Beachten Sie, dass dies generisch sein soll, damit jemand die Ausgabedatei in Cron ändern kann und das Skript nicht geändert werden muss.

+1

bewegen den E-Mail-Teil des Prozesses ein Wrapper-Skript, das 'someScript.sh' aufruft, prüft, ob es korrekt ausgeführt wurde und sendet dann entsprechend gestaltete E-Mails (Erfolg, Warnung oder Fehler). ELSE setze eine logFile var, exportiere sie, ersetze tmp/... oben mit $ logFile, und verlasse dich auf $ {logFile} im Skript. Viel Glück. – shellter

Antwort

9

Die einfachste Sache, die ich denken konnte, ist, dass:

readlink -f /proc/$$/fd/1 

$$ die PID des Skripts (im Skript). Auf den meisten Unix-Systemen ist/proc/[pid] das Pseudoverzeichnis, das Informationen für den Prozess [pid] enthält.

/proc/[pid]/fd ist ein Verzeichnis mit einer Liste von Symlinks für die geöffneten Dateideskriptoren des Prozesses. fd/0 ist Eingabe, fd/1 ist die Ausgabe des Skripts, etc.

readlink gibt Ihnen dann die Zieldatei oder tty, wenn Sie die Ausgabe nicht umleiten.

Natürlich, wenn Sie es anzeigen möchten, müssen Sie es irgendwo anders als Standard-Ausgabe anzeigen, oder es wird umgeleitet werden! Um zu debuggen, versuchen Sie den Standardfehler (2).

Verschiedene callings diese Ergebnisse auf meine Box geben (script.sh ruft nur readlink -f/proc/$$/fd/1> & 2)

# ./script.sh 
/dev/pts/0 

# ./script.sh > /var/tmp/foo 
/var/tmp/foo 

# ./script.sh | more 
/proc/12132/fd/pipe:[916212] 
+0

Super! Ich akzeptiere die Antwort. @ Huelbois. Ich wünsche Ihnen, dass Sie mehr Stimmen dafür bekommen. –

+0

Ich kommentiere, weil Linux ** ** ** hier in Tag war. Ich habe '/ proc' nicht auf meinem Mac. – anubhava

+0

Danke @ringträger!Hatte nicht viel Zeit, um an Mac zu arbeiten, nur 20 Tage in einem schmerzhaften Projekt. Trotzdem bekommt man sehr interessante Dinge von/proc pseudo-filesystem, es lohnt sich, einen Blick darauf zu werfen. – huelbois

4

Anstatt zu versuchen, einen Hack zu finden (und das ist auch plattformabhängig), es ist besser, hier einen etwas anderen Ansatz zu wählen.

Stellen Sie Ihre Cron-Job wie folgt aus:

someScript.sh /tmp/cronlog/somescript.$(date +%Y%m%d).log 

das heißt ohne und > oder 2>&1 (stdout/stderr Streams Umleitungen) und nur ein Argument mit dem gewünschten logfile Namen übergeben.

nun innerhalb someScript.sh wie diese Ströme auf Ihre Log-Datei umleiten:

LOGFILE=$1 
exec &>${LOGFILE} 

Und schließlich können Sie dann Nachricht Ihre Kunden, dass:

"output details could be found in ${LOGFILE}" 
Verwandte Themen