Chtěl bych buď program, nebo raději způsob, jak zaznamenat využití disku.
Abych vysvětlil, co tím myslím, když si někdo nainstaluje Ubuntu, použije se přibližně 4,5 GB disku. Když pak nainstalujete/odinstalujete programy, toto využití se zvýší nebo sníží.
Co chci, je způsob, jak automaticky přihlásit aktuální disk, který se používá v souboru txt, když dojde ke změně (něco je nainstalováno/uloženo nebo odinstalováno/smazáno) s časem a datem, kdy k této změně došlo.
Přijatá odpověď:
Pomocí df
příkaz ke sledování místa na disku a lsblk
příkaz pro sledování připojených jednotek, níže uvedený skript, spuštěný na pozadí, zaznamená změny ve volném prostoru všech připojených jednotek. Vytvoří soubor protokolu:~/disklog
kam zapisuje změny (v k
).
Pokud jej spustíte v terminálu, zobrazí výsledek současně.
Obsah souboru protokolu vypadá takto:
[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
Jak používat
- Zkopírujte níže uvedený skript do prázdného souboru a uložte jej jako
log_diskusage.py
-
V sekci head skriptu nastavte časový interval, prahovou hodnotu a maximální počet řádků v souboru protokolu:
#--- 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 #---
interval
ke spuštění kontrol místa na disku tak, jak jsou, 20 sekundtreshold
:Pravděpodobně byste nechtěli zaznamenávat všechny (velmi) malé změny, protože disk má hodně malých změn volného místa na disku. Jak to je, je nastaveno na10k
max_lines
, protože soubor protokolu bude rychle růst, zvláště pokud nastavíte prahovou hodnotu na nulu
-
Otestujte skript pomocí příkazu:
python3 /path/to/log_diskusage.py
-
Pokud vše funguje dobře, přidejte jej do spouštěcích aplikací:Dash> Spouštěcí aplikace> Přidat.
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