Hallo
ich möchte gern per Dummy-Schalter manuell alle älteren LOG Files in einem Ordner löschen.
Wenn ich in der Linux Shell meines Raspberrys also folgenden Befehl absetze, sudo find /opt/fhem/log/* -mtime -7 -exec rm {} \;
werden in meinem FHEM LOG Ordner alle Files die älter als 7 Tage sind gelöscht. Ohne Sudo muß ich das Löschen jedes Files manuelle in der Shell bestätigen. (
rm: remove write-protected regular file '/opt/fhem/log/Wetterdaten-2019-05-12.log'? y
)
Wenn ich nun mein Dummy "logdelte" mit einem Notify anlege und den LINUX Befehl hinterlegte logdelete:on { system("sudo find /opt/fhem/log/* -mtime -2 -exec rm {} \;")}
, quittiert FHEM mir das brav mit einem -1 und es passiert leider nichts. Wenn ich dann testhalber eine anderen Linuxbefehl absetze z.B. logdelete:on { system("cat > /opt/fhem/log/test100.txt")}
dann funktioniert alles und FHEM führt den Befehl aus und schreibt die Datei test100.txt in den FHEM/Log Ordner.
Nun hab ich schonmal irgendwo gelesen dass FHEM wohl Probleme mit der Ausführung von sudo hat. Könnte es daran liegen?
Oder ist der Linux-Befehl oben eine Zusammensetzung aus mehren Befehlen und kann in FHEM deshalb nicht direkt ausgeführt werden, so dass man die Befehle vielleicht eine Batch file schreiben und ausführen muß?
Oder liegt es hier an eine Rechte-Problem. Der Besitzer ist FHEM und die Logs haben die Rechte 0777?
Installiere Dir doch logrotate
ZitatNun hab ich schonmal irgendwo gelesen dass FHEM wohl Probleme mit der Ausführung von sudo hat. Könnte es daran liegen?
Also... das ist kein Problem, sondern gewünscht ;)
Um sudo zu können, muss ein User (hier der fhem User) auch sudoer sein.
https://www.raspberrypi.org/documentation/linux/usage/root.md
Auf eigene Gefahr... ;)
Ansonsten kannst Du auch rm sagen, da er nicht mehr Nachfragen soll. Ist auf jedem Fall sicherer, als sudo!
Ich würde mal auf "-f" tippen, gucke aber lieber selber in die man-Pages: (man rm)
Zitat von: Herry-77 am 12 Mai 2019, 10:20:05
Oder ist der Linux-Befehl oben eine Zusammensetzung aus mehren Befehlen und kann in FHEM deshalb nicht direkt ausgeführt werden, so dass man die Befehle vielleicht eine Batch file schreiben und ausführen muß?
Hi,
wenn es mehr als ein Befehl ist, würde ich immer alles in ein Scriptfile schreiben und dieses dann in FHEM aufrufen.
Da kann man testen ob das Script funktioniert und das Script ist definiert in FHEM aufrufbar. Bei allem anderen spielen die unterschiedlichen Hochkomma, Interpretation von Sonderzeichen, Auflösung von Variablen, Behandlung von Stdout usw eine "komplizierte" Rolle.
Also wenn es kein Rechteproblem ist könnte rm -f helfen. Aber eigentlich sollte es keinen Unterschied machen ob mit oder ohne sudo aufgerufen. Wenn nur sudo geht, dann stimmen die Rechte nicht.
Zitat-f, --force
ignore nonexistent files and arguments, never prompt
FHEM hat kein Problem mit sudo, man muss es nur ordentlich einrichten. Und man sollte genau wissen was man tut: sudo ist meist ein dünnes Brett, welches gern gebohrt wird.
Gruß Otto
Kurze Frage,
find bietet doch selbst die Option
delete an, oder nicht?
find /opt/fhem/log/ -type f -mtime +7 -delete
(Ob das mit den Rechten passt, kann ich nicht sagen - ich nutze das um den Backup-Ordner sauber zu halten (https://forum.fhem.de/index.php/topic,87669.msg800934.html#msg800934) - aber meiner Vermutung müsste das mit dem User
fhem in dem Ordner laufen, der zumindest auch Schreibrechte haben müsste)
Laut
man find (http://man7.org/linux/man-pages/man1/find.1.html) erwartet
mtime eine Zahl
n weil diese mit 24h multipliziert wird. Demnach wäre -7 eigentlich unlogisch (würde dann in Zukunft liegen, oder?).
Zitat-mtime n
File's data was last modified n*24 hours ago. See the
comments for -atime to understand how rounding affects the
interpretation of file modification times.
-atime n
File was last accessed n*24 hours ago. When find figures out
how many 24-hour periods ago the file was last accessed, any
fractional part is ignored, so to match -atime +1, a file has
to have been accessed at least two days ago.
EDIT
Ich hatte auch mal dies gefunden, aber bisher nicht getestet (behält immer die neusten 10 files und löscht den rest):
ls -1t | tail -n +11 | xargs rm -f
ZitatWhere,
ls : List directory contents.
-1t : 1(Number one) indicates that the output of ls should be one file per line. t indicates sort contents by modification time, newest first.
tail : Output the last part of files.
-n +11 : output the last NUM lines, instead of the last 10; or use -n +NUM to output starting with line NUM
xargs : Build and execute command lines from standard input.
rm -f : Remove files or directories. f indicates ignore nonexistent files and arguments, never prompt. It means that this command won't display any error messages if there are less than 10 files.
| – It is a pipeline. It is generally a sequence of one or more commands separated by one of the control operators | or |&.
(Quelle: https://www.ostechnix.com/find-delete-oldest-file-x-files-directory/)
Das + oder - bei find bedeutet, icnl. vor (oder nach) dem Alter.
Ansonsten würde ein "ind /opt/fhem/log/ -type f -mtime 7" (alsoi ohne +/-) nur Dateien finden, die genau an exakt 7 *24 Stunden Bearbeitet wurden (mtime = Modifikation-Time). Also auch keine älteren ...
find /opt/fhem/log/ -type f -mtime +7 -delete
Super das hat funktioniert.
Warum die ursprüngliche Befehlszeile aus FHEM ( egal ob mit oder ohne rm -f)nicht geht wird wohl ein Rätsel bleiben.
Ich danke euch.