desktop pieno e vuoto(low-res)+

Oggi voglio spiegarvi come impostare uno script che passi da un desktop pieno di applicazioni e con il compositing attivato a un desktop dall’aspetto minimale, utile per limitare il consumo di risorse in previsione di usi impegnativi della macchina, quali videogaming, ma anche registrazione/produzione audio e altri compiti che non richiedano un aspetto curato del desktop, ma solo praticità;

Come potete vedere dall’immagine corre una differenza abissale tra i due screenshot, nonostante siano bastate una decina di righe richiamabili da terminale o addirittura da scorciatoie della tastiera!

Non preoccupatevi, non occorrono approfondite conoscenze di programmazione: vedremo passo dopo passo quali comandi faranno al caso vostro e verranno spiegati in modo più chiaro possibile;

Voglio specificare che non darò nulla per scontato, onde agevolare gli utenti più digiuni di linguaggio bash; Capisco che gli utenti un pò più preparati in materia potranno trovare l’articolo prolisso ma potranno subito saltare ai comandi principali e suggerire modifiche o miglioramenti commentando l’articolo.

La prima cosa da fare è aprire un editor di testo: gedit, kate, leafpad sono i più comuni;

Salvate in file con un nome chiaro e riconoscibile come:

minimal-desktop.sh

questo vi aiuterà da adesso in poi perchè l’editor colora in modo diverso la sintassi dello script, ad esempio in gedit:

  • in blu scuro vedrete i commenti;
  • in marrone i comandi;
  • in viola scuro le variabili;
  • in rosa le parti virgolettate;

Scrivete alla prima riga senza spazi ne ritorni a capo, ovvero a partire da riga 1 e colonna 1:

#!/bin/bash

questo suggerirà allo script quale interprete utilizzare;

Fatto questo potete inserire qualche riga di commento per indicare cosa fa lo script; So benissimo che si tratta di un lavoro apparentemente superfluo ma se vorrete condividere lo script o consultarlo in futuro i commenti vi aiuteranno;

Potete inserirli anteponendo un # al testo, cosi che l’inteprete ignorerà la riga o porzione di riga subito dopo l’hash:

# script di prova 

sudo apt-get update       # verifica la presenza di aggiornamenti

in questo modo sarà sempre chiaro a chi legge cosa fa lo script, mentre di fatto bash leggerà solo il comando che tutti conoscono.

Da adesso iniziano i comandi veri e propri, che ovviamente variano da sistema a sistema; Come esempio prenderemo un desktop che utilizzi:

  • Conky
  • Screenlets
  • Cairo-dock

che l’utente avrà bisogno di terminare;

N.B. Per programmi diversi da questi la procedura sarà molto simile, ma cambieranno ovviamente i nomi.

Per uccidere questi processi esistono due comandi:

killall nome-processo
kill pid-del-processo

Nel caso di conky e cairo dock basterà quindi eseguire:

killall cairo-dock;
killall conky;

Sarà prudente fare prima una prova eseguendo i singoli i comandi in un terminale, qualora venissero chiuse queste applicazioni potete inserirli nello script.

Adesso parliamo delle screenlets, che richiedono una procedura diversa ma ugualmente efficace, che si rende necessaria perchè il comando:

killall screenlets

restituirà come output:

screenlets: nessun processo trovato

dobbiamo quindi identificare tutti i pid delle screenlets in esecuzione, ma sebbene per conky possa bastare:

pidof conky

per screenlets la formula è:

ps -C python -o pid=,args= | awk '/FolderViewScreenlet\.py$/ {print $1}'

ringrazio l’utente crap0101 per avermi spiegato qui la procedura;

Con questo comando avrete come output il pid della screenlet “folder view”; Qualora aveste ad esempio anche mail check il comando sarà:

ps -C python -o pid=,args= | awk '/MailCheckScreenlet\.py$/ {print $1}'

Ne consegue che per ogni screenlet (e ovviamente anche per il demone screenlets, se non intendete averlo a disposizione) in esecuzione dovrete cambiare il nome da ricercare (l’ho evidenziato in grassetto nei comandi) e in questo vi aiuterà il task manager in cui vedrete una riga per ogni widget, formulata in questo modo:

python -u /usr/share/screenlets/cartella-screenlet/nome-screenlet.py

quindi copierete di volta in volta la riga e sostituirete mail check con i nomi che vedete in task manager, rispettando le maiuscole.

Come sopra, proviamo prima nel terminale:

$: ps -C python -o pid=,args= | awk '/MailCheckScreenlet\.py$/ {print $1}'
2675
$: kill -SIGKILL 2675

Produrrà come risultato l’uccisione di mail check screenlet.

N.B. ho usato 4 numeri casuali per indicare il pid, non usate quel comando se non volete chiudere erroneamente qualche vostra applicazione!

Ora nello script per maggior chiarezza è bene inserire:

# variabile che stabilisce il pid di mailcheck
mailcheck_pid=`ps -C python -o pid=,args=\
 | awk '/MailCheckScreenlet\.py$/ {print $1}'` 

# uccide mail check
kill -SIGKILL $mailcheck_pid 

# variabile che stabilisce il pid di folder view
folderview_pid=`ps -C python -o pid=,args=\
 | awk '/FolderViewScreenlet\.py$/ {print $1}'` 

# uccide folder view
kill -SIGKILL $folderview_pid 

# variabile che stabilisce il pid screenlets daemon
screenlets_daemon_pid=`ps -C python -o pid=,args=\
 | awk '/screenlets-daemon\.py$/ {print $1}'`        

# uccide il demone screenlet
kill $screenlets_daemon_pid

e cosi via per tutte le vostre screenlet.

Alcune doverose precisazioni:

  • il comando assegnato alle variabili va racchiuso tra i backquote, che dicono all’interprete di eseguire come un comando quello che si trova al loro interno, sono ottenibili con la combinazione altgr+’;
  • è possibile andare a capo nel comando lungo, per mantenere lo script ordinato, con l’uso di “\” che dice all’interprete: “aspetta, non finisce qui il mio comando!”;
  • nel comando kill, è necessaria l’opzione -SIGKILL per terminare le screenlet, ma non è necessaria per terminare il demone;

Arrivati a questo punto non rimane che disabilitare la visualizzazione composita, se lo ritenete opportuno;

Nel mio caso, con xfce e quindi con xfwm4 come gestore delle finestre, il comando è il seguente:

xfconf-query -c xfwm4 -p /general/use_compositing -t bool -s false

Sostituendo false con true qualora vogliate riabilitarlo;

Non conosco purtroppo i comandi per ogni window manager, ma una breve ricerca su google dovrebbe portarvi la soluzione; Se l’avete trovata o la conoscete già e volete riportarla nei commenti, sarà sicuramente benvenuta 🙂

Riassumendo, lo script avrà un’aspetto simile a questo:

#!/bin/bash

# script per minimizzare l'uso di risorse

# chiude cairo dock
killall cairo-dock

# chiude tutti i conky
killall conky

# chiude tutte le screenlets

# variabile che stabilisce il pid di mailcheck
mailcheck_pid=`ps -C python -o pid=,args=\
 | awk '/MailCheckScreenlet\.py$/ {print $1}'` 
# uccide mail check
kill -SIGKILL $mailcheck_pid 

# variabile che stabilisce il pid di folder view
folderview_pid=`ps -C python -o pid=,args=\
 | awk '/FolderViewScreenlet\.py$/ {print $1}'` 

# uccide folder view
kill -SIGKILL $folderview_pid 

# variabile che stabilisce il pid screenlets daemon
screenlets_daemon_pid=`ps -C python -o pid=,args=\
 | awk '/screenlets-daemon\.py$/ {print $1}'`        

# uccide il demone screenlet
kill $screenlets_daemon_pid

# disabilita il compositore di xfwm4 
xfconf-query -c xfwm4 -p /general/use_compositing -t bool -s false 

# fine dello script 
exit

Non vi rimane che renderlo eseguibile, basta digitare dalla cartella in cui l’avete salvato:

chmod +x minimal-desktop.sh

Adesso potete assegnare allo script una combinazione di tasti, o creare un lanciatore per eseguirlo;

Se invece vi piacerebbe lanciarlo nel terminale, è necessario creare un alias nel vostro .bashrc e apportare qualche piccola modifica per renderlo più leggibile tramite i comandi:

  • echo, che stampa una stringa
  • sleep n, dove è il numero di secondi dopo la quale viene eseguita l’operazione successiva, utile per leggere meglio i messaggi

Avremo quindi nello script:

#!/bin/bash
# script per minimizzare l'uso di risorse

# chiude cairo dock
killall cairo-dock
echo "cairo dock terminata"
sleep 1

# chiude tutti i conky
killall conky
echo "conky terminato"
sleep 1

# chiude tutte le screenlets

# variabile che stabilisce il pid di mailcheck
mailcheck_pid=`ps -C python -o pid=,args=\
 | awk '/MailCheckScreenlet\.py$/ {print $1}'` 
# uccide mail check
kill -SIGKILL $mailcheck_pid 

# variabile che stabilisce il pid di folder view
folderview_pid=`ps -C python -o pid=,args=\
 | awk '/FolderViewScreenlet\.py$/ {print $1}'` 

# uccide folder view
kill -SIGKILL $folderview_pid 

# variabile che stabilisce il pid screenlets daemon
screenlets_daemon_pid=`ps -C python -o pid=,args=\
 | awk '/screenlets-daemon\.py$/ {print $1}'`        

# uccide il demone screenlet
kill $screenlets_daemon_pid
echo "screenlets terminate" 
sleep 1 

# disabilita il compositore di xfwm4 
xfconf-query -c xfwm4 -p /general/use_compositing -t bool -s false 
echo "compositing disabilitato
sleep 1 

# fine dello script 
exit

Se volete, potete scrivere un’altro script per rilanciare tutte le applicazioni, avendo cura di terminare ogni comando con “&” cosi da lanciarle in background:

#!/bin/bash

# rilancia le applicazione chiuse con desktop-minimal

conky&
sleep 1

cairo-dock&
sleep 1

python -u /usr/share/screenlets-manager/screenlets-daemon.py&
sleep 1
python -u /usr/share/screenlets/FolderView/FolderViewScreenlet.py&
sleep 1
python -u /usr/share/screenlets/MailCheck/MailCheckScreenlet.py&

exit

Un piccolo “trucco” che ho utilizzato nel mio script è quello di disabilitare l’avvio automatico delle stesse applicazioni, per poi reinserirlo con il secondo script.

Si tratta semplicemente di consultare i due percorsi ~/.config/autostart /etc/xdg/autostart che conterranno i file per l’avvio automatico di (ad esempio) cairo dock, conky, screenlets;

Preso nota dei nomi di questi file basta spostarli in un altra cartella a vostro piacimento nel primo script, e copiarli nelle directory di origine con il secondo script per riaverli in avvio automatico.

N.B. se i file sono in /etc è necessario essere root, eseguite la procedura solo con i comandi mv e cp, facendo inoltre molta attenzione a quello che digitate, e provando come sempre i singoli comandi nel terminale.

Per qualunque chiarimento, consiglio o suggerimento non esitate a commentare!

Per oggi è tutto dal vostro DrV,

Happy scripting a tutti!

Annunci