Bash exécuter qu'une fois par session ?

Bonjour,

j’aimerais ne pas répéter le système de vérification des paquets installés si l’utilisateur est dans la même sessions et qu’il a déjà exécuté le script .sh.

La fonction :

function check_package() { if [ $(dpkg-query -W -f='${Status}' libwww-perl 2>/dev/null | grep -c "ok installed" 2>&1) -eq 0 ] then echo -e "${RED}ERROR${NORMAL}: ${RED}libwww-perl package doesn't appear to be installed, please run ${NORMAL}(${RED}WITH ROOT USER${NORMAL}).${NORMAL}(${RED}Run${NORMAL}: ${RED}aptitude install libwww-perl ${NORMAL}or ${RED}sudo aptitude install libwww-perl${NORMAL})"; #echo -e $"Package perl" exit 1 elif [ ! -x `which awk` ]; then echo -e "${RED}ERROR${NORMAL}: ${RED}awk package doesn't appear to be installed, please run ${NORMAL}(${RED}WITH ROOT USER${NORMAL}).${NORMAL}(${RED}Run${NORMAL}: ${RED}aptitude install libwww-perl ${NORMAL}or ${RED}sudo aptitude install libwww-perl${NORMAL})"; exit 1 elif [ $(dpkg-query -W -f='${Status}' bsd-mailx 2>/dev/null | grep -c "ok installed") -eq 0 ]; then echo -e "${RED}ERROR${NORMAL}: ${RED}bsd-mailx package doesn't appear to be installed, please run ${NORMAL}(${RED}WITH ROOT USER${NORMAL}).${NORMAL}(${RED}Run${NORMAL}: ${RED}aptitude install bsd-mailx or sudo aptitude install bsd-mailx) ${NORMAL}"; exit 1 fi }

Pour résumé, je me connecte en ssh, je lance ./monbash.sh la première fois, on vérifie les paquets sinon on passe la séquence. Si je me déconnecte on remet à 0 et on refait la procédure.

En espérant avoir été assez précis, je vous remercie.

Cordialement,

Peux-tu détailler un peu cela ?

Se déconnecter de quoi ? On remet à zéro quoi ?

Une méthode générale pour ne pas exécuter deux fois le même script au même moment est de se servir d’un fichier comme d’un sémaphore.

C’est à dire qu’au début du script on créé un fichier (par exemple [mono]"$HOME"/.semaphores/check_package[/mono]), et on le supprime juste avant la fin du script. Si le fichier existe déjà au début de l’exécution du script, on sait qu’une autre instance du script est en cours d’exécution, donc on quitte.

  1. je me connecte à la machine en ssh ou directement depuis un terminal (si gnome ou autres interfaces…)
  2. je lance le script
  3. il vérifie les paquets
  4. je ferme le script
  5. je ré ouvre le script (et là je veux passer l’étape de vérification)
  6. je me déconnecte de ssh ou depuis le terminal
  7. on reprends la procédure cité ci-dessus.

Est ce plus compréhensible ?

[quote].semaphores[/quote] pourrais tu développer ou me donner un lien car je connaissais pas ou il s’agit d’une redirection à faire et que je peux le nommer comme bon me semble ?

Pour moi, pas vraiment. Mais ce n’est pas grave, ce n’est pas nécessaire.

Tu peux le nommer comme bon te semble. Voici un exemple de script :

[code]#!/bin/sh

if [ -e “$HOME”/abcdef.txt ]; then
exit
fi

touch “$HOME”/abcdef.txt

echo "Début de l’exécution du script"
sleep 50 # Effectuer des calculs intensifs ici
echo “Fin de l’exécution du script”

rm “$HOME”/abcdef.txt[/code]

Essaye de lancer ce script deux fois de suite rapidement et tu verras que la deuxième tentative n’affichera rien.

C’est une solution effectivement, merci.

J’ai une solution qui me semble plus propre mais qui t’impose de quitter ta session proprement.
Dans les shell populaire (Zsh, Bash, …) tu as un script qui est lancé à la clôture de la session.
Tout se passe avec le fichier “.logout” normalement.
Mais il me semble que pour qu’il soi exécuter il faut que tu quitte ta session avec un “quit” et non pas fermer ta fenêtre de connexion SSH.
Avec ça tu devrais pouvoir faire ce que tu veux.
Par exemple à la première exécution de ton script tu créé un fichier dans /tmp et quand tu te quitte la session (proprement) tu le supprime. Et à chaque exécution de ton script tu vérifie la présence de ce fichier pour savoir si tu vérifie ce que tu souhaite ou non.

Salut,

Ceci répondra peut-être à tes besoins, en combinant … :think:

[mono]nohup[/mono] est une commande qui permet de lancer un processus qui restera actif même après la déconnexion de l’utilisateur.

Cette dernière peut s’avérer très utile si on la combine au ‘&’ qui permet de lancer un processus en arrière plan.

$ ssh user@la_bas
$ nohup ./monbash.sh &
$ exit 

A chaque utilisation, la commande crée un fichier de log nommé nohup.out, permettant de consulter les messages qui auraient dû s’afficher sur la console.

[quote=“Mimoza”]J’ai une solution qui me semble plus propre mais qui t’impose de quitter ta session proprement.
Dans les shell populaire (Zsh, Bash, …) tu as un script[/quote]
Tu as cette solution qui a l’air pas mal : superuser.com/a/410534.
Si tu es dans des connexions distantes tu peut te baser sur le retour de la commande [mono]tty[/mono] pour savoir si tu es dans une nouvelle session ou pas.

@Mimoza merci cependant, moi même je ne quit pas le terminal avec exit donc les utilisateurs qui auront le script ne le font certainement pas…

@BelZéButh je ne peux pas utiliser nohup car le script ouvre un menu etc…

@MisterFreez je vais approfondir la chose, merci.