Nun, ich bin ein Linux-Neuling und habe ein Problem mit einem einfachen Bash-Skript.
Ich habe ein Programm, das einer Protokolldatei hinzugefügt wird, während sie ausgeführt wird. Mit der Zeit wird diese Protokolldatei riesig. Ich möchte ein Startskript erstellen, das die Protokolldatei vor jedem Lauf umbenennt und verschiebt und effektiv separate Protokolldateien für jeden Programmlauf erstellt. Folgendes habe ich bisher:
DATE=$(date +"%Y%m%d%H%M")
mv server.log logs/$DATE.log
echo program
Beim Laufen sehe ich Folgendes:
: command not found
program
Wenn ich in das Protokollverzeichnis cd und dir ein Verzeichnis ausführe, sehe ich Folgendes:
201111211437\r.log\r
Was ist los? Ich gehe davon aus, dass mir ein Syntaxproblem fehlt, aber ich kann es scheinbar nicht herausfinden.
UPDATE: Dank des Kommentars von Shellter unten habe ich festgestellt, dass das Problem darauf zurückzuführen ist, dass ich die .sh-Datei in Notepad ++ in Windows bearbeite und sie dann per FTP an den Server sende, wo ich die Datei über ssh ausführe . Nach dem Ausführen von dos2unix für die Datei funktioniert es.
Neue Frage: Wie kann ich die Datei überhaupt korrekt speichern, um zu vermeiden, dass dieses Update bei jedem erneuten Senden der Datei durchgeführt werden muss?
\r
ist carriage_return, überprüfen Sie Ihr Bash-Skript, ist möglicherweise im Skript enthaltenlogs/$DATE.log
stimmt, aber die Eingabeecho logs/$DATE.log
gibt den richtigen Pfad aus.DATE=$(date +"%Y%m%d%H%M")
?Antworten:
Die wenigen Zeilen, die Sie in Ihrem Skript gepostet haben, sehen für mich in Ordnung aus. Es ist wahrscheinlich etwas tiefer.
Sie müssen herausfinden, in welcher Zeile dieser Fehler auftritt. Fügen Sie
set -xv
oben in Ihrem Skript hinzu. Dadurch werden die Zeilennummer und der Befehl, der an STDERR ausgeführt wird, ausgedruckt . Auf diese Weise können Sie feststellen, wo in Ihrem Skript dieser bestimmte Fehler auftritt.Übrigens, haben Sie einen Scheiß oben in Ihrem Skript? Wenn ich so etwas sehe, erwarte ich normalerweise, dass es ein Problem mit dem Shebang ist. Wenn Sie beispielsweise
#! /bin/bash
oben waren, sich aber Ihr Bash-Interpreter in befindet/usr/bin/bash
, wird dieser Fehler angezeigt.BEARBEITEN
Zwei Wege:
quelle
\r
der Dateiname angezeigt. Es gibt ein unsichtbares\r
am Ende jeder Zeile in Ihrem Programm.mv server.log logs/$(date -d "today" +"%Y%m%d%H%M").log
quelle
date +"%Y%m%d%H%M"
wenn Ihre Bash ein bisschen anders istEine einzeilige Methode innerhalb von Bash funktioniert so.
[einige ausgegeben]> $ (Datum "+% Y.% m.% d-% H.% M.% S"). ver
erstellt eine Datei mit einem Zeitstempelnamen mit der Erweiterung ver. Eine Arbeitsdatei, in der die Momentaufnahme eines Datumsstempeldateinamens wie folgt aufgelistet ist, kann zeigen, dass sie funktioniert.
find . -type f -exec ls -la {} \; | cut -d ' ' -f 6- >$(date "+%Y.%m.%d-%H.%M.%S").ver
Natürlich
cat somefile.log > $(date "+%Y.%m.%d-%H.%M.%S").ver
oder noch einfacher
ls > $(date "+%Y.%m.%d-%H.%M.%S").ver
quelle
Ich benutze diesen Befehl zum einfachen Drehen einer Datei:
Im lokalen Ordner habe ich
2019-09-25-output.log
quelle
Nun, es ist keine direkte Antwort auf Ihre Frage, aber es gibt ein Tool in GNU / Linux, dessen Aufgabe es ist, Protokolldateien regelmäßig zu drehen und alte Dateien bis zu einem bestimmten Grenzwert zu komprimieren. Es ist
logrotate
quelle
Sie können Ihre Skripte in den Editor schreiben, aber stellen Sie sicher, dass Sie sie mit diesem -> $ sed -i 's / \ r $ //' yourcripthere konvertieren
Ich benutze es die ganze Zeit, wenn ich in Cygwin arbeite und es funktioniert. Hoffe das hilft
quelle