Sto cercando di realizzare uno script bash per pulire automaticamente un sistema Debian.
Sono partito da alcuni spunti offerti da questa discussione sul forum ufficiale di Ubuntu, da un mio precedente articolo in cui ho già illustrato alcuni strumenti di manutenzione e di pulizia e (non per ultime) dalla mie esperienze dei sistemi GNU/Linux.

Lo script di seguito è inteso per Debian, Ubuntu e derivate varie (comunque per qualsiasi distribuzione che abbia a disposizione apt-get e dpkg. Per altre distribuzioni, sarebbero necessarie alcune piccole modifiche) ed è da considerarsi  allo stato embrionale nonché realizzato a scopi didattici/conoscitivi. Posta diversamente, vi sconsiglio di utilizzarlo sul vostro computer, a meno che non sappiate cosa state facendo :-)

Attualmente lo script si occupa di:

  1. pulire la cache dei pacchetti (apt-get clean e apt-get autoclean) e rimuovere i pacchetti inutilizzati (apt-get autoremove);
  2. rimuovere pacchetti obsoleti e residui di configurazione (tramite dkpg con le opportune opzioni);
  3. rimuovere pacchetti orfani (tramite deborphan, che deve essere installato sulla macchina);
  4. rimuovere i file temporanei (per intenderci, il contenuto di /tmp), svuotare il cestino, rimuovere le thumbnail (le anteprime delle immagini, che vengono salvate in cache) e diversi “file spazzatura” (ovvero file di backup, quelli che hanno la tilde ~ all’inizio del nome, file Thumbs.db e file Desktop.ini);
  5. svuotare la cache dei browser (attualmente solo Firefox/Iceweasel e Google Chrome);
  6. rimuovere lo storico delle conversazioni dei client di messaggistica (attualmente solo Empathy e Skype).

Il sorgente è disponibile qui:
http://docs.mirkopagliai.it/bash/system-cleaner/system-cleaner_0.1-alpha

L’output nel terminale è questo:

Pulizia del sistema

Note:

  1. cosa accade alla riga 26? Semplicemente, alla successiva riga 30 dpkg rimuove i pacchetti obsoleti e i residui di configurazione. Il problema è che se questi non sono presenti (=nessun pacchetto obsoleto presente, nessun residuo di configurazione), genera un errore. Di conseguenza, alla riga 26 viene preventivamente controllata la loro presenza tramite un semplice costrutto if;
  2. in rete esistono svariate alternative a questo script, molte delle quali includono vari apt-get update, apt-get upgrade e via dicendo (incluso apt-get -f install e persino aggiornamenti a Grub). Non sono stati intenzionalmente inseriti nel mio script, primo perché nulla hanno a che vedere con la pulizia del sistema (semmai hanno a che fare con l’aggiornamento), secondo perché sono comandi per i quali è bene controllare di persona l’output e – sulla base di questo controllo – decidere come comportarsi di conseguenza;
  3. lo script può fare uso di alcuni strumenti/software che sono generalmente opzionali (per ora solo deborphan, ma vorrei aggiungere anche localepurge), ovvero che non sono installati di default e che vanno quindi installati dall’utente.
    Sarebbe quindi necessario integrare un controllo per verificarne anticipatamente la presenza, altrimenti si avranno inevitabilmente errori legati a comandi non trovati. Nell’eventualità e nel momento in cui certi strumenti/software non fossero disponibili, si potrebbe consigliare all’utente (anche solo verbalmente) l’installazione degli stessi o in alternativa proporgliela de facto proprio tramite questo script.
    Non ho ancora idea di come integrare questo controllo, forse (?) leggendo l’output di whereis;
  4. bisognerebbe implementare un log, almeno dei file cancellati dallo script, preferibilmente anche delle azioni compiute dallo stesso e del loro esito (positivo o negativo);
  5. per ora lo script cancella la cache di Firefox/Iceweasel e di Google Chrome e le vecchie conversazioni di Empathy e Skype. L’azione andrebbe ovviamente estesa anche ad altri browser (Opera? Chromium?) ed altri client di messaggistica (Pidgin? Kopete? Emesene? Amsn?);
  6. l’input dell’utente è letto case sensitive, ovvero viene fatta distinzione tra la “s” minuscola e la “S” maiuscola. Quindi per ora funziona correttamente solo digitando come input la “s” minuscola.
    Le possibilità sono due, ovvero o si aggiunge un operatore OR così che l’if tenga presente anche un’eventuale “S” maiuscola, oppure si trasforma tutto l’input in minuscolo prima prima che venga eseguito l’if, così che la cosa diventi indifferente;
  7. si potrebbero raccogliere alcune parti di codice in funzioni, anche solo per rendere lo stesso codice meglio leggibile;
  8. attualmente lo script è solo interattivo, ovvero richiede che l’utente risponda esplicitamente alle domande poste. Questo rende impossibile eseguirlo in background, magari all’avvio del sistema, come magari piacerebbe a qualcuno.
    Certamente con poche e semplici modifiche si potrebbe avviare al problema (basta rimuovere i vari costrutti if che si basano sull’input dell’utente), ma sarebbe più professionale prevedere un’opzione da passare allo script (ad esempio, qualcosa come –quiet) e che faccia sì che lo stesso venga eseguito senza porre nessuna domanda.

Se qualcuno volesse testarne il funzionamento, è sufficiente creare un file vuoto nella vostra home (ad esempio esegui-pulizia), copia-incollare al suo interno il sorgente qui sopra mostrato, renderlo eseguibile:

chmod +x esegui-pulizia

e infine lanciarlo:

./esegui-pulizia

Ci tengo comunque a precisare – e per l’ennesima volta – che lo script non è da considerarsi come attendibile: non mi assumo responsabilità se poi i risultati non sono quelli desiderati o se peggio il sistema dovesse essere danneggiato.

Ad ogni modo, ho aperto un’apposita discussione su Debianizzati.org per ricevere segnalazioni e suggerimenti. Se ne avete voglia, potete usare anche i commenti sotto questo articolo.

Ad majora :-)

Espandi/comprimi Commenti

[…] lo sviluppo del mio script per la pulizia del sistema, cominciato qui. Dalle iniziali 83 righe di codice, già ora siamo a 227, motivo per cui non mi è più possibile […]

XHTML - Puoi usare questi tag: <a href="" title=""> <abbr title=""> <acronym title=""> <b> <blockquote cite=""> <cite> <code> <del datetime=""> <em> <i> <q cite=""> <strike> <strong>