Ich möchte entweder ein Programm oder noch besser eine Möglichkeit, die Festplattennutzung zu protokollieren.
Um zu erklären, was ich meine, wenn jemand Ubuntu installiert, werden ungefähr 4,5 GB Festplatte verwendet. Wenn Sie dann Programme installieren/deinstallieren, nimmt diese Nutzung zu oder ab.
Was ich möchte, ist eine Möglichkeit, automatisch die aktuelle Festplatte, die in einer txt-Datei verwendet wird, zu protokollieren, wenn es eine Änderung gibt (etwas wird installiert/gespeichert oder deinstalliert/gelöscht), mit der Uhrzeit und dem Datum, an dem diese Änderung aufgetreten ist.
Akzeptierte Antwort:
Mit dem df
Befehl zum Nachverfolgen des Speicherplatzes und lsblk
Um die gemounteten Laufwerke zu verfolgen, protokolliert das folgende Skript, das im Hintergrund ausgeführt wird, Änderungen im freien Speicherplatz aller gemounteten Laufwerke. Es erstellt eine Protokolldatei:~/disklog
wohin es Änderungen schreibt (in k
).
Wenn Sie es im Terminal ausführen, wird das Ergebnis gleichzeitig ausgegeben.
Der Inhalt der Protokolldatei sieht folgendermaßen aus:
[mountpoint / change / date/time / used]
/ . . . . . . . . . . . . . . . . . . 36 k Fri Mar 27 08:17:30 2015 used 87989352 k
/media/intern_2 . . . . . . . . . . . -1792 k Fri Mar 27 08:17:32 2015 used 562649592 k
/ . . . . . . . . . . . . . . . . . . -4 k Fri Mar 27 08:17:39 2015 used 87989356 k
/ . . . . . . . . . . . . . . . . . . -36 k Fri Mar 27 08:17:43 2015 used 87989392 k
/ . . . . . . . . . . . . . . . . . . -4 k Fri Mar 27 08:17:55 2015 used 87989396 k
/ . . . . . . . . . . . . . . . . . . 4 k Fri Mar 27 08:18:11 2015 used 87989392 k
/ . . . . . . . . . . . . . . . . . . -32 k Fri Mar 27 08:18:13 2015 used 87989424 k
Verwendung
- Kopieren Sie das folgende Skript in eine leere Datei und speichern Sie es als
log_diskusage.py
-
Legen Sie im Head-Bereich des Skripts das Zeitintervall, den Schwellenwert und die maximale Anzahl von Zeilen in der Protokolldatei fest:
#--- set time interval in seconds, threshold in k, and the max number of lines in the logfile interval = 20 # the interval between the checks threshold = 0 # in K, you'd probably set this higher max_lines = 5000 # if you want no limit, comment out the line line_limit() in the script #---
- Das
interval
20 Sekunden, um die Festplattenplatzprüfungen so wie sie sind durchzuführen - Der
treshold
:Sie möchten wahrscheinlich nicht alle (sehr) kleinen Änderungen aufzeichnen, da die Festplatte viele enthält von kleinen Änderungen im freien Speicherplatz. So wie es ist, ist es auf10k
eingestellt - Die
max_lines
, da die Logdatei schnell wächst, insbesondere wenn Sie den Schwellenwert auf Null setzen
- Das
-
Testen Sie das Skript mit dem Befehl:
python3 /path/to/log_diskusage.py
-
Wenn alles funktioniert, fügen Sie es zu Ihren Startanwendungen hinzu:Dash> Startanwendungen> Hinzufügen.
Das Skript
#!/usr/bin/env python3
import subprocess
import os
import time
log = os.environ["HOME"]+"/disklog.txt"
#--- set time interval in seconds, threshold in k
interval = 1
threshold = 0
max_lines = 5000
#---
def line_limit():
lines = open(log).readlines()
if len(lines) > max_lines:
with open(log, "wt") as limit:
for l in lines[-max_lines:]:
limit.write(l)
get = lambda cmd: subprocess.check_output([cmd]).decode("utf-8")
def disk_change():
mounted = [l[l.find("/"):] for l in get("lsblk").splitlines() if "/" in l]
data = get("df").splitlines()
matches = [("/", data[1].split()[-4])]
for l in mounted:
if l != "/":
match = [(l, d.replace(l, "").split()[-3]) for d in data if l in d][0]
matches.append(match)
return matches
disk_data1 = disk_change()
while True:
time.sleep(interval)
disk_data2 = disk_change()
for latest in disk_data2:
try:
compare = [(latest[0], int(latest[1]), int(item[1])) for item in disk_data1 if latest[0] == item[0]][0]
if not compare[1] == compare[2]:
diff = compare[2]-compare[1]
if abs(diff) > threshold:
with open(log, "a") as logfile:
drive = compare[0]; lt = 18-int((len(drive)/2)); lk = 14-len(str(diff))
s = drive+" ."*lt+lk*" "+str(diff)+" k \t"+str(time.strftime("%c"))+"\t"+"used "+str(compare[1])+" k\n"
logfile.write(s)
print(s, end = "")
# if you don't want to set a limit to the max number of lines, comment out the line below
line_limit()
except IndexError:
pass
disk_data1 = disk_data2