Vorrei un programma o, più preferibilmente, un modo per registrare l'utilizzo del disco.
Per spiegare cosa intendo, quando qualcuno installa Ubuntu vengono utilizzati circa 4,5 GB di disco. Quindi, quando installi/disinstalla programmi, questo utilizzo aumenta o diminuisce.
Quello che voglio è un modo per registrare automaticamente il disco corrente che viene utilizzato in un file txt quando c'è una modifica (qualcosa è installato/salvato o disinstallato/cancellato) con l'ora e la data in cui si è verificata questa modifica.
Risposta accettata:
Usando il df
comando per tenere traccia dello spazio su disco e lsblk
comando per tenere traccia delle unità montate, lo script seguente, eseguito in background, registrerà le modifiche nello spazio libero di tutte le unità montate. Crea un file di registro:~/disklog
dove scrive le modifiche in (in k
).
Se lo esegui nel terminale, visualizzerà il risultato contemporaneamente.
Il contenuto del file di registro è simile a:
[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
Come si usa
- Copia lo script qui sotto in un file vuoto, salvalo come
log_diskusage.py
-
Nella sezione head dello script, imposta l'intervallo di tempo la soglia e il numero massimo di righe nel file di log:
#--- 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 #---
- L'
interval
per eseguire i controlli dello spazio su disco, così com'è, 20 secondi - La
treshold
:Probabilmente non vorresti tenere traccia di tutte le (molto) piccole modifiche, dal momento che il disco ha molto di piccole modifiche nello spazio libero su disco. Così com'è, è impostato su10k
- Il
max_lines
, poiché il file di log crescerà rapidamente, soprattutto se imposti la soglia a zero
- L'
-
Eseguire il test dello script con il comando:
python3 /path/to/log_diskusage.py
-
Se tutto funziona correttamente, aggiungilo alle tue applicazioni di avvio:Dash> Applicazioni di avvio> Aggiungi.
Il copione
#!/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