# Bash exécuter qu'une fois par session ?

**URL:** <https://www.debian-fr.org/t/bash-executer-quune-fois-par-session/62799>\
**Category:** Programmation\
**Created:** [Février 21, 2016, 8:31 UTC](https://www.debian-fr.org/t/bash-executer-quune-fois-par-session/62799 "2016-02-21T20:31:58Z")\
**Posts on this page:** 9\
**Page:** 1

<div class="post-metadata">

**Author:** ![eric0279](https://www.debian-fr.org/letter_avatar_proxy/v4/letter/e/94ad74/32.png) [@eric0279](https://www.debian-fr.org/u/eric0279)\
**Post date:** [Février 21, 2016, 8:31 UTC](https://www.debian-fr.org/t/bash-executer-quune-fois-par-session/62799/1 "2016-02-21T20:31:58Z")

</div>

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,

---

<div class="post-metadata">

**Author:** ![rod](https://www.debian-fr.org/letter_avatar_proxy/v4/letter/r/50afbb/32.png) [@rod](https://www.debian-fr.org/u/rod)\
**Post date:** [Février 21, 2016, 8:31 UTC](https://www.debian-fr.org/t/bash-executer-quune-fois-par-session/62799/2 "2016-02-21T20:31:58Z")

</div>

> [@eric0279](#):
>
> on vérifie les paquets sinon on passe la séquence

Peux-tu détailler un peu cela ?

> [@eric0279](#):
>
> Si je me déconnecte on remet à 0 et on refait la procédure.

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]«&nbsp;$HOME&nbsp;»/.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.

---

<div class="post-metadata">

**Author:** ![eric0279](https://www.debian-fr.org/letter_avatar_proxy/v4/letter/e/94ad74/32.png) [@eric0279](https://www.debian-fr.org/u/eric0279)\
**Post date:** [Février 21, 2016, 8:31 UTC](https://www.debian-fr.org/t/bash-executer-quune-fois-par-session/62799/3 "2016-02-21T20:31:58Z")

</div>

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 ?

---

<div class="post-metadata">

**Author:** ![rod](https://www.debian-fr.org/letter_avatar_proxy/v4/letter/r/50afbb/32.png) [@rod](https://www.debian-fr.org/u/rod)\
**Post date:** [Février 21, 2016, 8:31 UTC](https://www.debian-fr.org/t/bash-executer-quune-fois-par-session/62799/4 "2016-02-21T20:31:58Z")

</div>

> [@eric0279](#):
>
> Est ce plus compréhensible ?

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

> [@eric0279](#):
>
> [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 ?

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

[code]#!/bin/sh

if [-e «&nbsp;$HOME&nbsp;»/abcdef.txt]; then  
exit  
fi

touch «&nbsp;$HOME&nbsp;»/abcdef.txt

echo «&nbsp;Début de l’exécution du script&nbsp;»  
sleep 50 # Effectuer des calculs intensifs ici  
echo «&nbsp;Fin de l’exécution du script&nbsp;»

rm «&nbsp;$HOME&nbsp;»/abcdef.txt[/code]

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

---

<div class="post-metadata">

**Author:** ![eric0279](https://www.debian-fr.org/letter_avatar_proxy/v4/letter/e/94ad74/32.png) [@eric0279](https://www.debian-fr.org/u/eric0279)\
**Post date:** [Février 21, 2016, 8:31 UTC](https://www.debian-fr.org/t/bash-executer-quune-fois-par-session/62799/5 "2016-02-21T20:31:58Z")

</div>

C’est une solution effectivement, merci.

---

<div class="post-metadata">

**Author:** ![Mimoza](https://www.debian-fr.org/user_avatar/www.debian-fr.org/mimoza/32/3858_2.png) [@Mimoza](https://www.debian-fr.org/u/Mimoza)\
**Post date:** [Février 21, 2016, 8:32 UTC](https://www.debian-fr.org/t/bash-executer-quune-fois-par-session/62799/6 "2016-02-21T20:32:17Z")

</div>

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.

---

<div class="post-metadata">

**Author:** ![BelZeButh](https://www.debian-fr.org/letter_avatar_proxy/v4/letter/b/5fc32e/32.png) [@BelZeButh](https://www.debian-fr.org/u/BelZeButh)\
**Post date:** [Février 21, 2016, 8:32 UTC](https://www.debian-fr.org/t/bash-executer-quune-fois-par-session/62799/7 "2016-02-21T20:32:18Z")

</div>

Salut,

Ceci répondra peut-être à tes besoins, en combinant … ![:think:](https://www.debian-fr.org/uploads/default/original/1X/98cae0704aea0201d04f151843e80a3ecd391eca.gif "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 ‹&nbsp;&&nbsp;› qui permet de lancer un processus en arrière plan.

```auto
$ 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.

---

<div class="post-metadata">

**Author:** ![MisterFreez](https://www.debian-fr.org/letter_avatar_proxy/v4/letter/m/bb73d2/32.png) [@MisterFreez](https://www.debian-fr.org/u/MisterFreez)\
**Post date:** [Février 21, 2016, 8:32 UTC](https://www.debian-fr.org/t/bash-executer-quune-fois-par-session/62799/8 "2016-02-21T20:32:19Z")

</div>

[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](http://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.

---

<div class="post-metadata">

**Author:** ![eric0279](https://www.debian-fr.org/letter_avatar_proxy/v4/letter/e/94ad74/32.png) [@eric0279](https://www.debian-fr.org/u/eric0279)\
**Post date:** [Février 21, 2016, 8:33 UTC](https://www.debian-fr.org/t/bash-executer-quune-fois-par-session/62799/9 "2016-02-21T20:33:14Z")

</div>

@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.
