Ich habe eine Textdatei in meinem Home-Verzeichnis, die regelmäßig über einen Cron-Job Daten empfängt. Da der Cron-Job dynamische Daten bereitstellt, möchte ich auch einen Cron-Job zum Leeren des Dateiinhalts festlegen (die Datei muss noch vorhanden sein). Ich brauche keine Hilfe bei Cron, nur den Befehl, der beim Leeren der Datei helfen kann.
command-line
Sosytee
quelle
quelle
tail -n +1000 file.txt > file.txt
sollte 1000 Zeilen entfernen und die neuesten Zeilen in der Datei behalten (Sie wissen nie, wann Sie einen Teil des letzten Datensatzes benötigen, um etwas zu verfolgen).Antworten:
Der einfachste Weg:
Dies ist ein weniger offensichtlicher Weg und wahrscheinlich für andere in einem Shell-Skript weniger lesbar, aber es ist alles, was Sie brauchen.
Da
>
es sich nicht wirklich um einen Befehl handelt (er ist in Bash integriert), können Sie Folgendes nicht verwenden:wenn Sie keine Berechtigungen für diese Datei haben. Aber Sie können verwenden:
quelle
sudo crontab -e
, um den Cron-Job für root hinzuzufügen, nicht für Sie. Oder die Datei ändert die Erlaubnis, 766 (oder 666), nicht auf 755:sudo chmod 766 filename
. Weitere Informationentruncate filename
ist ein wenig sauberer und einfacher als das Umleiten leerer Ausgaben in die Datei und stößt nicht auf Probleme mitsudo
.truncate -s 0 filename
kann in der Tat den Trick machen. Sie können es als Antwort hinzufügen.Zu diesem Zweck wurde ein Tool erstellt:
Dadurch wird der Inhalt gelöscht, es bleibt jedoch die gleiche Datei (die Inode bleibt gleich).
Dies ist wichtig, da einige Programme ein Handle auf die Datei "by inode" haben. Angenommen, Sie "leeren" eine Datei mithilfe der naiven Methode zum Löschen und Neuerstellen der Datei. Einige Programme behalten möglicherweise immer noch ein Handle für die alte Datei (mit dem alten Inhalt), auch wenn sie nicht mehr wie gewohnt sichtbar ist
ls
.Einige Links zu weiteren Details am Ende dieser Antwort.
Ein anderer Weg, vielleicht leichter zu merken:
Dies hält auch die gleiche Inode.
Beachten Sie, dass beide
truncate
undecho -n
nicht von POSIX definiert werden .Für die POSIX-Konformität verwenden Sie
cat /dev/null
:Noch ein anderer Weg, obskurer und wahrscheinlich nicht Shell-Agnostiker:
Wenn die zu schneidende Datei zum Schreiben Root-Rechte benötigt, funktionieren die folgenden Zeilen nicht wie erwartet:
Dies liegt daran, dass die Umleitung von der Shell durchgeführt wird, noch bevor sudo ausgeführt wird. Dies bedeutet, dass der Schreibzugriff auf die Datei mit den Rechten des Benutzers erfolgt, der die Shell ausführt, nicht mit den Rechten, die von sudo gewährt werden.
Eine Problemumgehung besteht darin, die Umleitung auf eine Shell zu verschieben, die mit folgenden sudo-Berechtigungen ausgeführt wird:
Für die Verwendung von
truncate
benötigen Sie keine solche Problemumgehung, da der Schreibzugriff nicht von der Shell vorgenommen wird, sonderntruncate
von sudo mit sudo-Berechtigungen ausgeführt wird.Einige wichtige Informationen zu Programmen, die die Datei geöffnet halten, auch wenn die Datei gelöscht wurde, finden Sie in den folgenden Abschnitten:
quelle
Um dies zu automatisieren, können Sie logrotate verwenden. Erstellen Sie einfach eine Konfigurationsdatei für die Datei, die geleert werden soll, fügen Sie weitere Einstellungen hinzu und Sie können sie jeden Tag automatisch anhand von Kriterien leeren lassen, die Sie beispielsweise für den täglichen Gebrauch auswählen oder wenn die Datei größer als usw. ist.
Schauen Sie sich hier an, wie Sie logrotate konfigurieren: http://linuxcommand.org/man_pages/logrotate8.html
quelle
echo "" > foo_file
ist eine einfache Möglichkeit, dies zu tun, wird es die gesamten Inhalt ersetzen foo_file mit „“ so dass es in diesem Fall leer.Sie können auch verwenden
cat /dev/null > foo_file
, dass das Null-Gerät liest und Ihre Datei mit gar nichts überschreibt.quelle