Ändern des Umleitungspfads bei laufendem Skript

Ändern des Umleitungspfads bei laufendem Skript

Ich habe ein Skript, das immer eine Ausgabe erzeugt, bei der ich es in eine Datei umgeleitet habe. Ich versuche, die umgeleitete Datei zu rotieren. Unten starte ich das Skript und leite es um:

.
somecode
.    
su - username -c "command >> /path/to/directory/output.txt" &
.
.
code continues..

und unten ist die Crontab, die ich zu erstellen versuche:

cd /path/to/directory/
timestamp=`date "+%Y%m%d"`
mv ./output.txt ./logs/output.txt_$timestamp
touch output.txt
chmod 757 ./output.txt
gzip ./logs/output.txt_$timestamp
find ./logs/output.txt* -type f -mtime +2 | xargs rm

oder auch dieses hat nicht funktioniert:

timestamp=`date "+%Y%m%d"`
cp ./output.txt ./logs/output.txt_$timestamp
echo "" > ./output.txt
gzip ./logs/output.txt_$timestamp

Im ersten Code schlägt das ursprüngliche Skript fehl und funktioniert nicht mehr, und im zweiten Skript wird die Datei output.txt nicht bereinigt.

Gibt es eine Möglichkeit, dies zu tun und gleichzeitig das Skript weiter auszuführen? Hinweis: Ich verwende Unix Solaris.

Dank im Voraus.

Antwort1

Dies geschieht normalerweise durch Hinzufügen einesSEUFZENDHandler, der den Befehl neu startetnachdem ein anderer Befehl (normalerweise logrotate) die Datei verschoben hat. Auf *nix-Betriebssystemen können Sie Dateien verschieben, während sie beschrieben werden (ich glaube mit der Einschränkung, dass sie sich noch im selben Dateisystem befinden müssen); die zusätzlichen Zeilen werden an die Datei am neuen Speicherort angehängt.

Antwort2

stdoutSie können die umgeleiteten und/oder eines laufenden Prozesses nicht wirklich stderrin eine neue Datei ändern (siehe Hinweis unten) (Das ist ein Grund, warum die Verwendung umgeleiteter stdoutoder stderrals Protokolldateien für lang laufende Prozesse einschlechtIdee.)

Wenn der Prozess gestartet wird, werden die Umleitungselemente des Befehls von der Shell ausgeführt, die den Prozess startet. Die Zieldatei wird geöffnet und ggf. im richtigen Modus (Anhängen oder Überschreiben) erstellt und je nach Umleitungsmodus möglicherweise auf null Byte gekürzt. Anschließend wird der geöffnete Dateideskriptor an den untergeordneten Prozess übergeben. Dieser geöffnete Dateideskriptor ist der einzige Link zur umgeleiteten Datei, den der untergeordnete Prozess hat – im wahrsten Sinne des Wortes. Es ist ein Link zur Datei.

Und das ist ein wichtiger Punkt - als direkter Link zur Datei ist der geöffnete Deskriptor dem Verzeichniseintrag für die Datei - dem "Dateinamen" - gleichgestellt. Das Ändern dieses Namens oder sogar das Löschen dieses Verzeichniseintrags - wie beispielsweise mit dem rmBefehl - hat dabei keinerlei Auswirkungen auf den geöffneten Dateideskriptor.

Die Antwort von @l0b0 ist richtig, dass Prozesse, die Protokolle rotieren müssen, dazu neigen, SIGHUPHandler für solche Rotationen zu verwenden, aber das „Rotieren von Protokollen“ ist im Fall einer umgeleiteten Ausgabe nicht wirklich so einfach – wie wird die neue Ausgabedatei benannt? Der untergeordnete Prozess hat keine Ahnung, wie der „Name“ von ihm stdoutund/oder stderrlautet – und die Ausgabe-„Datei“ ist möglicherweise überhaupt keine Datei.

Protokollrotationsschemata müssenentworfenin den Prozess - das Logging sollte so integriert sein, dass Logeinträge nicht beispielsweise beim Rotieren der Logdatei verloren gehen.

(OK, es kann seinmöglichum die stdout/ stderrStreams für einen laufenden Prozess zu ändern - aber es ist etwas, das - wieder -entworfenin den Prozess. Das ist nichts, was eine vorgefertigte Binärdatei wie bashautomatisch macht, wenn Sie ihr ein SIGHUP... senden.)

Antwort3

Vielen Dank an alle für Ihre Antworten. Ich konnte keine Möglichkeit finden, dies zu tun. Als Workaround habe ich die Crontab so eingerichtet, dass das Originalskript gestoppt wird, die Rotation durchgeführt wird und es außerhalb der Spitzenzeiten erneut gestartet wird.

verwandte Informationen