[bash] mon script est lent

Autres projets et contributions
Avatar de l’utilisateur
Maximilien LIX
yeomen
Messages : 211
Inscription : mer. 23 avr. 2014, 14:27

[bash] mon script est lent

Message par Maximilien LIX »

Hello world !
Depuis quelques jours, histoire de tuer le temps, j'ai créé une nouvelle commande (qui est en fait un script bash) dont le but est de permettre d'administrer ma archlinux de manière plus simple. Avec quelques arguments, il est possible de configurer mkinitcpio.conf, le fichier pour grub et pacman.conf par exemple. (il aussi possible de défragmenter firefox ect.)

Pour cela j'utilise plusieurs case, méthode assez...bon ce n'est peut-être pas du grand art mais ça marche :)

Code : Tout sélectionner

#!/bin/bash

# admin is a simple bash script created by Maximilien Di Dio, email address: mrgamerlix@gmail.com
# This program is under licence GPLv3 http://www.gnu.org/licenses/gpl.txt

RESETC="$(tput sgr0)"
YELLOW="$(tput bold ; tput setaf 3)"
RED="$(tput bold ; tput setaf 1)"

USER_DIR="$HOME"
FIREFOX_DEFRAG="$(for i in ~/.mozilla/firefox/*/*.sqlite; do sqlite3 $i 'VACUUM;'; done)"
FIREFOX_PROFILE="firefox -p"
KERNEL="linux"
ROOT_COMMAND="sudo"
TEXT_EDITOR="$EDITOR"
PACKAGE_MANAGER_EDIT="/etc/pacman.conf"
PACKAGE_MANAGER_UPDATE="pacman -Syu"
GRUB_EDIT="/etc/default/grub" 
GRUB_UPDATE="grub-mkconfig -o  /boot/grub/grub.cfg"
KERNEL_EDIT="/etc/mkinitcpio.conf"
KERNEL_UPDATE="mkinitcpio -p"
UPMSG="Make an update of the program."
EDMSG="Edit the config file of the program."
FFDEF="Only for Firefox ! To make it faster !"
FFPRO="Only for Firefox ! To manage the profiles."

case $1 in
        "-pacman")
        case $2 in
                "-edit")
                $ROOT_COMMAND $TEXT_EDITOR $PACKAGE_MANAGER_EDIT
                ;;
                "-update")
                $ROOT_COMMAND $PACKAGE_MANAGER_UPDATE
                ;; 
                *)
                echo -e "${RED}ERROR${RESETC} Invalid command !\nExecute admin -help for more information !"
                ;;
        esac
        ;;
        "-kernel")
        case $2 in
                "-edit")
                $ROOT_COMMAND $TEXT_EDITOR $KERNEL_EDIT
                ;;
                "-update")
                $ROOT_COMMAND $KERNEL_UPDATE $KERNEL
                ;;
                *)
                echo -e "${RED}ERROR${RESETC} Invalid command !\nExecute admin -help for more information !"
                ;;
        esac
        ;;
        "-grub")
        case $2 in
                "-edit")
                $ROOT_COMMAND $TEXT_EDITOR $GRUB_EDIT
                ;;
                "-update")
                $ROOT_COMMAND $GRUB_UPDATE
                ;;
                *)
                echo -e "${RED}ERROR${RESETC} Invalid command !\nExecute admin -help for more information !"
                ;;
        esac
        ;;
        "-firefox")
        case $2 in
                "-defrag")
                $FIREFOX_DEFRAG
                ;;
                "-profile")
                $FIREFOX_PROFILE
                ;;
                *)
                echo -e "${RED}ERROR${RESETC} Invalid command !\nExecute admin -help for more information !"
                ;;
        esac   
        ;;
        "-help")
        echo -e "\n${YELLOW}admin is a program which must be used like that:${RESETC}\n\nadmin [program] [option]\n\n${YELLOW}programs availables:${RESETC}\n\n-pacman\n-kernel\n-grub\n-firefox\n\n${YELLOW}options availables:${RESETC}\n\n-edit       $EDMSG\n-update     $UPMSG\n-defrag     $FFDEF\n-profile    $FFPRO\n\n"
        ;;
        *)
        echo -e "${RED}ERROR${RESETC} Invalid command !\nExecute admin -help for more information !"
        ;;
esac

exit
Le problème est qu'à présent lorsque j'exécute la commande, cette dernière met du temps à répondre. :/ Je crois que le fait que bash vérifie toutes les conditions fait que l'exécution est lente.

Du coup comment puis-je m'y prendre pour accélérer la chose ? :) Cordialement.
Linuxien et blogueur en carton
Acer AX3810 (Archlinux & Debian)
Acer Aspire V5 (ubuntu-Mate)
Lenovo Thinkpad Edge E330 (Archlinux)
Avatar de l’utilisateur
benjarobin
Maître du Kyudo
Messages : 17187
Inscription : sam. 30 mai 2009, 15:48
Localisation : Lyon

Re: [bash] mon script est lent

Message par benjarobin »

Si je ne dit pas de bêtise FIREFOX_DEFRAG est exécuté tout au début...
Zsh | KDE | PC fixe : core i7, carte nvidia
Titre d'un sujet : [Thème] Sujet (état) / Règles du forum
Moviuro
Elfe
Messages : 765
Inscription : dim. 17 juin 2012, 22:49

Re: [bash] mon script est lent

Message par Moviuro »

benjarobin a écrit :Si je ne dit pas de bêtise FIREFOX_DEFRAG est exécuté tout au début...
Effectivement. Ce qui est entre $(...) est exécuté et c'est la sortie stdout de ladite commande qui est retournée dans la variable.

Aussi, il y a plein de remarques de forme à faire sur ton script, je t'incite donc à aller sur http://www.shellcheck.net/ pour tester ton script et appliquer les différentes remarques proposées pour apprendre les bonnes méthodes de codage en bash ;)

(j'ajouterais aussi le shebang, il vaut mieux utiliser /usr/bin/env bash pour des soucis de portabilité ; il faut bannir les variables allcaps qui sont réservées aux variables d'environnement : bash sait utiliser des variables avec des noms en minuscules ; pour l'usage, utilise plutôt ceci qui est plus lisible :

Code : Tout sélectionner

cat << __EOH__
Coucou, ceci est un texte d'aide
il est lisible (mais j'ignore s'il supporte les changements de couleur)
__EOH__
)
psycho : Latitude E6430 ; BTRFS over LUKS, UEFI & secureboot
schizo : Acer 8942G ; KDE 4, BTRFS over LUKS ; W7 (prend la poussière)
toxo : i5-6600K, bspwm, VM W10 en PCI-passthrough
deadman : Lenovo Thinkcenter, OpenBSD 6.0-stable
popho.be : Kimsufi KS-3, FreeBSD 11.0
Loi de Murphy : Le jour où tu as besoin d'une backup, tu te dis que tu aurais dû en mettre en place
Venez sur IRC en plus du forum !
Avatar de l’utilisateur
Maximilien LIX
yeomen
Messages : 211
Inscription : mer. 23 avr. 2014, 14:27

Re: [bash] mon script est lent

Message par Maximilien LIX »

Shellcheck !? Je ne connaissais pas du tout merci ! :D
Oh oui grossière erreur pour FIREFOX_DEFRAG d'ailleurs mes variables seront en minuscules maintenant promis :)

Par contre, lorsque je teste mon script avec shellcheck celui-ci me renvoie pour erreur ceci https://github.com/koalaman/shellcheck/wiki/Sc2086 soit Double quote to prevent globbing and word splitting. pour l'utilisation des variables $TEXT_EDITOR $PACKAGE_MANAGER_UPDATE $KERNEL_UPDATE ect.

Ma question est la suivante, à quoi cela sert de mettre "" alors que visisblement bash sait comment interpréter ces variables ? :/
Linuxien et blogueur en carton
Acer AX3810 (Archlinux & Debian)
Acer Aspire V5 (ubuntu-Mate)
Lenovo Thinkpad Edge E330 (Archlinux)
Moviuro
Elfe
Messages : 765
Inscription : dim. 17 juin 2012, 22:49

Re: [bash] mon script est lent

Message par Moviuro »

Maximilien LIX a écrit :Ma question est la suivante, à quoi cela sert de mettre "" alors que visisblement bash sait comment interpréter ces variables ? :/
Toi, tu mets des commandes complètes dans des variables, donc ce n'est pas attendu que tu utilises les ".

Par contre

Code : Tout sélectionner

#!/usr/bin/env bash
variable="vim pacman"
pacman -S $variable # OK, car splitté
pacman -S "$variable" # "vim pacman" not found
psycho : Latitude E6430 ; BTRFS over LUKS, UEFI & secureboot
schizo : Acer 8942G ; KDE 4, BTRFS over LUKS ; W7 (prend la poussière)
toxo : i5-6600K, bspwm, VM W10 en PCI-passthrough
deadman : Lenovo Thinkcenter, OpenBSD 6.0-stable
popho.be : Kimsufi KS-3, FreeBSD 11.0
Loi de Murphy : Le jour où tu as besoin d'une backup, tu te dis que tu aurais dû en mettre en place
Venez sur IRC en plus du forum !
Avatar de l’utilisateur
Maximilien LIX
yeomen
Messages : 211
Inscription : mer. 23 avr. 2014, 14:27

Re: [bash] mon script est lent

Message par Maximilien LIX »

Ah ok je vois ! Merci :)

UP! L'un de vous aurait-il une archlinux avec syslinux dessus ? (En fait la vrai question est plutôt, qui veut jouer au bétatesteur ?)

J'ai ajouté à mon script deux fonctionnalités permettant d'éditer le fichier de configurartion de syslinux et de le mettre à jour.

Code : Tout sélectionner

#!/usr/bin/env bash

# admin 0.1 is a simple bash script created by Maximilien Di Dio, email address: mrgamerlix@gmail.com
# This program is under licence GPLv3 http://www.gnu.org/licenses/gpl.txt

RESETC="$(tput sgr0)"
YELLOW="$(tput bold ; tput setaf 3)"
RED="$(tput bold ; tput setaf 1)"

user_dir="$HOME"
firefox_profile="firefox -p"
kernel="linux"
root_command="sudo"
text_editor="$EDITOR"
package_manager_edit="/etc/pacman.conf"
package_manager_update="pacman -Syu"
grub_edit="/etc/default/grub" 
grub_update="grub-mkconfig -o  /boot/grub/grub.cfg"
syslinux_edit="/boot/syslinux/syslinux.cfg"
syslinux_update="syslinux-install_update -iam"
kernel_edit="/etc/mkinitcpio.conf"
kernel_update="mkinitcpio -p"
upmsg="Make an update of the program."
edmsg="Edit the config file of the program."
ffdef="Only for Firefox ! To make it faster !"
ffpro="Only for Firefox ! To manage the profiles."
bashrc_dir="~/.bashrc"
manual="man admin"
case $1 in
        "-pacman")
        case $2 in
                "-edit")
                $root_command $text_editor $package_manager_edit
                ;;
                "-update")
                $root_command $package_manager_update
                ;; 
                *)
                echo -e "${RED}ERROR${RESETC} Invalid command !\nRun admin -help for more information !"
                ;;
        esac
        ;;
        "-kernel")
        case $2 in
                "-edit")
                $root_command $text_editor $kernel_edit
                ;;
                "-update")
                $root_command $kernel_update $kernel
                ;;
                *)
                echo -e "${RED}ERROR${RESETC} Invalid command !\nRun admin -help for more information !"
                ;;
        esac
        ;;
        "-grub")
        case $2 in
                "-edit")
                $root_command $text_editor $grub_edit
                ;;
                "-update")
                $root_command $grub_update
                ;;
                *)
                echo -e "${RED}ERROR${RESETC} Invalid command !\nRun admin -help for more information !"
                ;;
        esac
        ;;
        "-syslinux")
        case $2 in
                "-edit")
                $root_command $text_editor $syslinux_edit
                ;;
                "-update")
                $root_command $syslinux_update
                ;;
                *)
                echo -e "${RED}ERROR${RESETC} Invalid command !\nRun admin -help for more information !"
                ;;
        esac 
        ;;
        "-bash")
        case $2 in
                "-edit")
                $text_editor $bashrc_dir
                ;;
                "-update")
                exec bash 
                ;;
                *)
                echo -e "${RED}ERROR${RESETC} Invalid command !\nRun admin -help for more information !"
                ;;
        esac
        ;;
        "-firefox")
        case $2 in
                "-defrag")
                for i in ~/.mozilla/firefox/*/*.sqlite; do sqlite3 $i 'VACUUM;'; done
                ;;
                "-profile")
                $firefox_profile 
                ;;
                *)
                echo -e "${RED}ERROR${RESETC} Invalid command !\nRun admin -help for more information !"
                ;;
        esac   
        ;;
        "-help")
        $manual
        ;;
        *)
        echo -e "${RED}ERROR${RESETC} Invalid command !\nRun admin -help for more information !"
        ;;
esac

exit
Et il y a aussi un manuel, au cas où. :)

Code : Tout sélectionner

.\" Manpage for admin.
.\" Contact mrgamerlix@gmail.com to correct errors or typos.
.TH man 1 "11 March 2015" "1.0" "admin 0.1 man page"
.SH NAME
admin \- A simple bash script for an Arch Linux administrator.
.SH SYNOPSIS
admin [PROGRAM] [OPTION]
.SH DESCRIPTION
admin is a simple command write in bash which allow a more easiest administration of Arch Linux.
.SH PROGRAMS
The programs availables are:
.br 
.B -pacman  
.I  The package manager by default.
.br
.B -kernel  
.I  The kernel which can be linux or linux-lts.
.br
.B -grub    
.I  The multiboot loader of GNU/Linux.
.br
.B -syslinux
.I  An another multiboot loader for GNU/Linux.
.br
.B -bash
.I  The default shell used by Arch Linux.
.br
.B -firefox  
.I  The most popular free web browser. 
.SH OPTIONS
The option can be different according the program selected !
.br
.B -edit    
.I Edit the config file of the program selected. Not for firefox !
.br
.B -update 
.I Make an update of the program. Not for firefox !
.br
.B -defrag 
.I Only for Firefox ! To make it faster.
.br
.B -profile
.I Only for Firefox ! To manage the profiles.
.SH SEE ALSO
The project is hosted on github, for more information: https://github.com/MaximilienLIX/admin
.SH BUGS
If you find a bug you can send me an email at: mrgamerlix@gmail.com
.SH AUTHOR
Maximilien Di Dio (mrgamerlix@gmail.com)
Manuel à placer dans /usr/local/man/man1/ puis ensuite

Code : Tout sélectionner

sudo gzip /usr/local/man/man1/admin.1 
(admin.1 soit le nom du manuel en fait :P )
D'ailleurs pour ce dernier, /usr/local/man/man1 est-il un bon emplacement ? (pour un manuel d'un commande ? Euh oui faut placer le script dans /usr/bin c'est plus pratique )
Linuxien et blogueur en carton
Acer AX3810 (Archlinux & Debian)
Acer Aspire V5 (ubuntu-Mate)
Lenovo Thinkpad Edge E330 (Archlinux)
Avatar de l’utilisateur
Xorg
Maître du Kyudo
Messages : 1933
Inscription : dim. 22 janv. 2012, 19:25
Localisation : Entre le clavier et la chaise.

Re: [bash] mon script est lent

Message par Xorg »

Maximilien LIX a écrit :J'ai ajouté à mon script deux fonctionnalités permettant d'éditer le fichier de configurartion de syslinux et de le mettre à jour.
Tu sais, Syslinux, ce n'est pas comme Grub. Quand tu modifies le fichier de configuration de Syslinux, il n'y a pas besoin de faire une étape supplémentaire, le changement est directement effectif. Par contre s'il y a une erreur dans le fichier, c'est une autre histoire.
Maximilien LIX a écrit :D'ailleurs pour ce dernier, /usr/local/man/man1 est-il un bon emplacement ? (pour un manuel d'un commande ? Euh oui faut placer le script dans /usr/bin c'est plus pratique )
Oulah, je rebonds là dessus... Dans le FHS, il est dit à peu près ceci :
- /{bin,sbin}, c'est la hiérarchie primaire, réservée aux commandes de base
- /usr/{bin,sbin}, c'est la hiérarchie secondaire, c'est censé ne pas être indispensables à un système minimaliste
- /usr/local/{bin,sbin}, c'est la hiérarchie tertiaire, pour les données locales, comme par exemple des applications compilées à la main

Sous Arch, tous les paquets utilisent le répertoire /usr/bin (ou bien on peut aussi trouver des binaires dans le /opt). Moi j'aime bien ne pas toucher au /usr, tout ce que j'installe à la main, je le mets dans le /usr/local.
Donc oui, /usr/local/man est un bon emplacement, tout comme /usr/local/bin en serait un bon pour ton script.

La hiérarchie tertiaire est dans le PATH, ça ne pose pas de problème. Par l'expérience, il y a bien le PATH de ld qui, par défaut, ne charge pas les bibliothèques qui se trouvent là-bas. :)
Mais si tu comptes faire un paquet, celui-ci devra installer les fichiers dans le /usr.
Arch Linux x86_64 - Sway
AMD Ryzen 5 3600X - 32 Go de DDR4 - SSD NVMe 1 To + SSD SATA 250 Go - Sapphire NITRO+ Radeon RX 580
Image AUR___Image Wiki___Image GitHub
Avatar de l’utilisateur
Maximilien LIX
yeomen
Messages : 211
Inscription : mer. 23 avr. 2014, 14:27

Re: [bash] mon script est lent

Message par Maximilien LIX »

Ok merci pour ces précieuses informations :D

J'adapterai mon script en conséquence !
Linuxien et blogueur en carton
Acer AX3810 (Archlinux & Debian)
Acer Aspire V5 (ubuntu-Mate)
Lenovo Thinkpad Edge E330 (Archlinux)
Avatar de l’utilisateur
Xorg
Maître du Kyudo
Messages : 1933
Inscription : dim. 22 janv. 2012, 19:25
Localisation : Entre le clavier et la chaise.

Re: [bash] mon script est lent

Message par Xorg »

D'ailleurs oui j'y pense, je rejoins ce que disait Benjarobin :

Code : Tout sélectionner

FIREFOX_DEFRAG="$(for i in ~/.mozilla/firefox/*/*.sqlite; do sqlite3 $i 'VACUUM;'; done)"
Dans tous les cas, ça va être interprété de la façon suivante : la viariable FIREFOX_DEFRAG va recevoir l'exécution de la ligne $(for i in ~/.mozilla/firefox/*/*.sqlite; do sqlite3 $i 'VACUUM;'; done). Donc dans tous les cas, c'est traité même si l'utilisateur ne le demande pas.

J'utiliserais plutôt une fonction à la place, telle :

Code : Tout sélectionner

firefox_defrag() {
	for i in ~/.mozilla/firefox/*/*.sqlite; do
		sqlite3 $i 'VACUUM;'
	done
}
Et du coup :

Code : Tout sélectionner

       ...
        "-firefox")
        case $2 in
                "-defrag")
                firefox_defrag
                ;;
                "-profile")
                ...
Mais après comme tu as fait dans ton message du 12 Mars ça va très bien aussi, c'est juste l'histoire d'avoir du bagage. :wink:
Arch Linux x86_64 - Sway
AMD Ryzen 5 3600X - 32 Go de DDR4 - SSD NVMe 1 To + SSD SATA 250 Go - Sapphire NITRO+ Radeon RX 580
Image AUR___Image Wiki___Image GitHub
Répondre