Tuesday, August 10, 2010

cleanKernel Script Doc

Στο netbook, ενα ASUS eeepc, εχω εγκαταστησει Ubuntu. Μετα απο καιρο, και καμποσα update οταν ξεκιναει εμφανιζονται αρκετα image πυρηνων που αφενος δεν χρησιμοποιω πια. Ετσι εφτιαξα ενα script για τη διαγραφη τους. Το script ολοκληρο μπορειτε να το κατεβασετε και να το δοκιμασετε απο το link που δινω πιο πανω. Για μενα ομως ηταν μια εξερευνηση στο κοσμο των script και θα παρουσιασω τις δυνατοτητες και τα εργαλεια που χρησιμοποιήθηκαν σαν οδηγο για αρχαριους για να δημιουργησουν δικα τους script. Αν και μικρο το προγραμμα χρησιμοποιει καποια πολυ δυνατα και χρησιμα εργαλεια οπως το awk στην πιο απλη μορφη του.

check it out!!!

Απο δω ξεκιναει καθε script, καλωντας το προγραμμα που θα το εκτελεσει. Οταν τρεχεις το προγραμμα αυτο τρεχει σε ενα καινουργιο bash.

#!/bin/bash


Με το συμβολο # δημιουργουμε σχολια.

#clean system and grub from old kernels that have been installed.
#the current script remove every kernel in your system and update the menu.lst
#



Η echo εμφανιζει το string στην κονσολα

echo "#############################"
echo " cleanKernels.sh "
echo "_-_-_-_-_-_-_-_-_-_-_-_-_-_-_"




Η εντολη ελεγχου if ελεγχει μια συνθηκη. Αυτη συντασετε :

if [ condition]; then
commands
fi

Η επιλογη -d ελεγχει αν το string ειναι directory και αν υπαρχει. Αν η συνθηκη ειναι αληθης θα δημιουργησει ενα φακελο log.

if [ ! -d "/home/j0ni/Documents/Scripts/Admin/logs" ] ;then

mkdir ~/Documents/Scripts/Admin/logs

fi

Αυτο που θελουμε ειναι να βρουμε ποιοι πυρηνες ειναι εγκατεστημενοι, να τους αποθηκευσουμε σε ενα αρχειο μεσα στο log directory, περνωντας ομως μονο τη στηλη που εμφανιζει την εκδοση. Καταρχην η dpkg-query -l θα δωσει μια λιστα με οτι βρει στη database της. Με διασωληνωση θα εξαιρεσουμε την τρεχουσα εκδοση, την οποια τρεχουμε. Η grep με την επιλογη -v κανει ακριβως αυτο. Η dpkg-query επιστρεφει μια λιστα πληροφοριων σε 3 στηλες (name,version,description). Για να απομονωσουμε μονο τη στηλη version oλα τα αποτελεσματα θα τα περασουμε απο το awk το οποιο θα μας επιστρεψει μονο τη δευτερη στηλη. Τελος τα αποτελεσματα θα αποθηκευτουν στο αρχειο με το ονομα που εχουμε ορισει με τη χρηση του '>' . Αυτο καθε φορα θα μας δειχνει τα αποτελεσματα της τελευταιας εκτελεσης( θα διαγραφει τα προηγουμενα). Αυτο γινεται γιατι μεσω του αρχειου θα σβησουμε τους πυρηνες και δεν θα μας χρειαζεται περαιτερο.

sudo dpkg-query -l 'linux-image-?.?.*'|grep -v `uname -r`|awk '{print $2}'>/home/j0ni/Documents/Scripts/Admin/logs/kernel-logs.txt


Η εντολη read διαβαζει απο την κονσολα οτι εισαγετε.


echo -e "do you want to erase these kernels?(yes or no)"

read yesorno


η for ειναι ελεγχος επαναληψης. Για να δειτε τη συνταξη και παραδειγματα δειτε εδω. Η for για μια σειρα μεταβλητων που οριζονται μετα το in παιρνει την περναει στην i. Ενα συντομο παραδειγμα ειναι :

$ for i in 1,2,3,4,5; do echo $i; done
1,2,3,4,5 #auto einai to output

Οπως βλεπετε και απο τον κωδικα στη λιστα μπορει να δωθει ενα αρχειο. Εδω συγκεκριμενα δινουμε την εξοδο της cat. Με αυτο τον τροπο στο i περναει καθε γραμμη του αρχειου και επειτα εκτελειται η εντολη διαγραφης.


for a in `cat /home/j0ni/Documents/Scripts/Admin/logs/kernel-logs.txt`; do

sudo apt-get -y remove $a

done


Επιτυχης εξοδος


exit 0


Οπως φαινεται η διαδικασια και οι εντολες ειναι απλες για κατι αρκετα χρησιμο. Εντωμεταξυ συμπεριελαβα σε ενα τοσο μικρο κομματι κωδικα χρησιμες εντολες, αλληλεπιδραση, απλη και γρηγορη λειτουργικοτητα. Αυτη ειναι η δυναμη των script. Αντιθετα θα επρεπε να παω στο synaptic και να διαλεξω τα πακετακια αυτα. Ευκολο και αυτο. Σε γραμμη εντολων θα ηθελα λιγο χρονο περισσοτερο. Τωρα με μια εντολη ολα στο μπαμ.

Οσοι θελουν μπορουν να το επεξεργαστουν και να μου στειλουν τη δικια τους εκδοση με τις δικιες τους δυνατοτητες.