J'aimerais soit un programme, soit de préférence un moyen d'enregistrer l'utilisation du disque.
Afin d'expliquer ce que je veux dire, lorsque quelqu'un installe Ubuntu, il y a environ 4,5 Go de disque utilisé. Ensuite, lorsque vous installez/désinstallez des programmes, cette utilisation augmente ou diminue.
Ce que je veux, c'est un moyen de consigner automatiquement le disque actuel utilisé dans un fichier txt lorsqu'il y a un changement (quelque chose est installé/enregistré ou désinstallé/supprimé) avec l'heure et la date auxquelles ce changement s'est produit.
Réponse acceptée :
Utiliser le df
commande pour garder une trace de l'espace disque, et le lsblk
commande pour garder une trace des lecteurs montés, le script ci-dessous, exécuté en arrière-plan, enregistrera les modifications dans l'espace libre de tous les lecteurs montés. Il crée un fichier journal :~/disklog
où il écrit les modifications (en k
).
Si vous l'exécutez dans le terminal, il affichera le résultat simultanément.
Le contenu du fichier journal ressemble à :
[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
Comment utiliser
- Copiez le script ci-dessous dans un fichier vide, enregistrez-le sous
log_diskusage.py
-
Dans la section head du script, définissez l'intervalle de temps, le seuil et le nombre maximum de lignes dans le fichier journal :
#--- 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
pour exécuter les vérifications d'espace disque, telles quelles, 20 secondes - Le
treshold
:Vous ne voudriez probablement pas conserver une trace de toutes les (très) petites modifications, car le disque en contient beaucoup de petits changements dans l'espace disque libre. En l'état, il est défini sur10k
- Les
max_lines
, car le fichier journal augmentera rapidement, surtout si vous définissez le seuil sur zéro
- L'
-
Testez le script avec la commande :
python3 /path/to/log_diskusage.py
-
Si tout fonctionne correctement, ajoutez-le à vos applications de démarrage : Dash > Applications de démarrage > Ajouter.
Le scénario
#!/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