script : savoir si c'est la première exécution depuis le dernier démarrage

Le
Francois Lafont
Bonjour à tous,

J'ai un script sur une Debian Squeeze qui s'exécute de temps en temps de
manière automatique (en fait à chaque fois que la fenêtre de connexion
apparaît, c'est-à-dire à chaque démarrage mais aussi après chaque
fermeture de session). L'exécution se fait via le compte root.

Je voudrais affiner le script pour qu'il se comporte légèrement
différemment suivant que l'exécution est la première depuis le dernier
démarrage ou non. Comment faire cela de manière fiable ?

J'avais pensé écrire un fichier « pipeau » dans /tmp, profitant du fait
que /tmp est vidé à chaque démarrage il me semble. Du coup, dans le
script, ça donnerait un truc dans le genre ça :

if [ -e /tmp/pipeau ]; then
# Alors ce n'est pas la première exécution
# depuis le dernier démarrage de la machine.
else
# Alors c'est la première exécution
# depuis le dernier démarrage de la machine.
# Du coup on crée le fichier.
touch /tmp/pipeau
fi

Mais je ne sais pas si c'est une bonne façon de faire :

1. Suis-je sûr que /tmp/pipeau sera effacé au prochain démarrage ?

2. Suis-je sûr qu'il ne peut pas être effacé à un moment donné alors
qu'il n'y a pas eu encore redémarrage ?

3. Lorsque je crée /tmp/pipeau, peut-être que ce fichier existe déjà
dans /tmp après tout (même si c'est hautement non probable) ?

Du coup, je me dis qu'on peut peut-être s'y prendre mieux que ça. :-)

Merci d'avance pour votre aide.

--
François Lafont
Vidéos High-Tech et Jeu Vidéo
Téléchargements
Vos réponses Page 1 / 3
Gagnez chaque mois un abonnement Premium avec GNT : Inscrivez-vous !
Trier par : date / pertinence
Luc.Habert.00__arjf
Le #24465821
Francois Lafont :

if [ -e /tmp/pipeau ]; then
# Alors ce n'est pas la première exécution
# depuis le dernier démarrage de la machine.
else
# Alors c'est la première exécution
# depuis le dernier démarrage de la machine.
# Du coup on crée le fichier.
touch /tmp/pipeau
fi



Si deux occurences du script sont lancées en meme temps, elles peuvent
toutes les deux tester l'existence de /tmp/pipeau avant que l'autre n'aie le
temps de le créer. C'est un exemple de ce que l'on appelle "race condition",
et qui est à la base d'un grand nombre de trous de sécurités, et, plus
généralement, de bug. La solution est d'utiliser la possibilité qu'offre le
noyau de jeter un programme qui lui demande de créer un fichier qui existe
déjà:

if sh -c 'set -C; : > /tmp/pipeau' 2>/dev/null; then
# c'est la première exécution
else
# c'est pas la première
fi

Le set -C dit au shell de ne pas accepter les redirections vers un fichier
existant. Je passe par un nouveau shell, parce que, au moins le dash avec
lequel je teste panique lors de l'echec d'un > au lieu de juste renvoyer un
code d'erreur pour la commande.

1. Suis-je sûr que /tmp/pipeau sera effacé au prochain démarrage ?

2. Suis-je sûr qu'il ne peut pas être effacé à un moment donné alors
qu'il n'y a pas eu encore redémarrage ?

3. Lorsque je crée /tmp/pipeau, peut-être que ce fichier existe déjà
dans /tmp après tout (même si c'est hautement non probable) ?



Pour toutes ces raisons, il est plus raisonnable de travailler ailleurs que
dans /tmp. Tu peux te créer un répertoire ad-hoc quelque part dans /var,
avec un script de boot qui l'efface (ou qui y monte un tmpfs). Ou profiter
de /var/run qui sert à ce genre de choses.
Doug713705
Le #24465881
Le 10-05-2012, Francois Lafont nous expliquait dans
fr.comp.os.linux.configuration :

Bonjour à tous,



Bonjour,

Mais je ne sais pas si c'est une bonne façon de faire :



Moi non plus.

1. Suis-je sûr que /tmp/pipeau sera effacé au prochain démarrage ?



Efface le toi même avec un script executé lors de l'extinction du
système.

Les scripts d'init sont là pour ça (par contre ne m'en demande pas plus,
je ne sais pas le faire sur une Debian).

2. Suis-je sûr qu'il ne peut pas être effacé à un moment donné alors
qu'il n'y a pas eu encore redémarrage ?



Mets les droits qui vont bien dessus.

3. Lorsque je crée /tmp/pipeau, peut-être que ce fichier existe déjà
dans /tmp après tout (même si c'est hautement non probable) ?



En toute logique tu devrais savoir ce qui se passe sur ton système, au
moins dans les grande ligne.

La probabilité qu'un tel fichier existe reste faible si c'est toi qui
en choisit le nom.

Plutôt que de créer un fichier /tmp/pipeau qui pourrait déjà exister,
peut-être qu'un fichier /tmp/pipeau/mon_pipeau serait plus 'sûr'
(disons encore moins probable).

--
Doug - Linux user #307925 - Slackware64 roulaize ;-)
http://usenet-fr.chainon-marquant.org
http://newsportal.chainon-marquant.org
http://news.chainon-marquant.org
Doug713705
Le #24465931
Le 10-05-2012, Francois Lafont nous expliquait dans
fr.comp.os.linux.configuration :

Bonjour à tous,



Bonjour,

Mais je ne sais pas si c'est une bonne façon de faire :



Moi non plus.

1. Suis-je sûr que /tmp/pipeau sera effacé au prochain démarrage ?



Efface le toi même avec un script executé lors de l'extinction du
système.

Les scripts d'init sont là pour ça (par contre ne m'en demande pas plus,
je ne sais pas le faire sur une Debian).

2. Suis-je sûr qu'il ne peut pas être effacé à un moment donné alors
qu'il n'y a pas eu encore redémarrage ?



Mets les droits qui vont bien dessus.

3. Lorsque je crée /tmp/pipeau, peut-être que ce fichier existe déjà
dans /tmp après tout (même si c'est hautement non probable) ?



En toute logique tu devrais savoir ce qu'il se passe sur ton système,
au moins dans les grande ligne.

La probabilité qu'un tel fichier existe reste faible si c'est toi qui
en choisit le nom.

Plutôt que de créer un fichier /tmp/pipeau qui pourrait déjà exister,
peut-être qu'un fichier /tmp/pipeau/mon_pipeau serait plus 'sûr'
(disons encore moins probable).

--
Doug - Linux user #307925 - Slackware64 roulaize ;-)
http://usenet-fr.chainon-marquant.org
http://newsportal.chainon-marquant.org
http://news.chainon-marquant.org
Lucas Levrel
Le #24465921
Le 10 mai 2012, Francois Lafont a écrit :

1. Suis-je sûr que /tmp/pipeau sera effacé au prochain démarrage ?



Clairement non. Mon /tmp est plein de fichiers temporaires « anciens »
(antérieurs au dernier démarrage) ; leur effacement est configurable
(opensuse 11.2) en fonction de l'âge.

3. Lorsque je crée /tmp/pipeau, peut-être que ce fichier existe déjà
dans /tmp après tout (même si c'est hautement non probable) ?



Il y a je crois une commande qui renvoie à tous les coups un nom libre
dans tmp, mais je ne la connais pas. (Ça t'aide, hein !)


--
LL
Luc.Habert.00__arjf
Le #24466001
Lucas Levrel :

Il y a je crois une commande qui renvoie à tous les coups un nom libre
dans tmp, mais je ne la connais pas. (Ça t'aide, hein !)



mktemp. Son option -d pour créer un répertoire temporaire est précieuse,
c'est beaucoup moins prise de tete de se créer un répertoire temporaire et
de bosser dedans à sa guise que de travailler directement dans /tmp.
Luc.Habert.00__arjf
Le #24465991
Mais en l'occurence, ça ne nous aide pas du tout parce qu'il faut que toutes
les instances du script utilisent le meme nom.
Francois Lafont
Le #24466101
Le 10/05/2012 11:47, Luc Habert a écrit :

Si deux occurences du script sont lancées en meme temps, elles peuvent
toutes les deux tester l'existence de /tmp/pipeau avant que l'autre n'aie le
temps de le créer. C'est un exemple de ce que l'on appelle "race condition",
et qui est à la base d'un grand nombre de trous de sécurités, et, plus
généralement, de bug. La solution est d'utiliser la possibilité qu'offre le
noyau de jeter un programme qui lui demande de créer un fichier qui existe
déjà:

if sh -c 'set -C; : > /tmp/pipeau' 2>/dev/null; then
# c'est la première exécution
else
# c'est pas la première
fi

Le set -C dit au shell de ne pas accepter les redirections vers un fichier
existant.



Ok mais j'ai un peu de mal à comprendre pourquoi ça enlève le problème
de la simultanéité. Avec ton test, si j'ai bien compris, il y a
tentative d'écriture du fichier /tmp/pipeau (en y insérant une chaîne de
caractère vide d'ailleurs si je ne m'abuse). L'idée c'est que lorsqu'il
y a tentative d'écriture dans un fichier, il ne peut avoir simultanéité
car le noyau ne le permet pas, c'est ça ?

Je passe par un nouveau shell, parce que, au moins le dash avec
lequel je teste panique lors de l'echec d'un > au lieu de juste renvoyer un
code d'erreur pour la commande.



Que veux-tu dire par « panique » ? Si on a un code d'erreur en retour,
c'est suffisant pour le test, non ? Pourquoi vouloir faire en sorte
qu'il y ait « panique » ?

1. Suis-je sûr que /tmp/pipeau sera effacé au prochain démarrage ?

2. Suis-je sûr qu'il ne peut pas être effacé à un moment donné alors
qu'il n'y a pas eu encore redémarrage ?

3. Lorsque je crée /tmp/pipeau, peut-être que ce fichier existe déjà
dans /tmp après tout (même si c'est hautement non probable) ?



Pour toutes ces raisons, il est plus raisonnable de travailler ailleurs que
dans /tmp. Tu peux te créer un répertoire ad-hoc quelque part dans /var,
avec un script de boot qui l'efface



J'aurais bien aimé faire en sorte que le script se suffise à lui-même et
ne pas faire intervenir un autre script.

(ou qui y monte un tmpfs).



Ah, monter un tmpfs peut être une bonne chose car là je suis sûr qu'à
chaque redémarrage, je repars sur un répertoire vide. Un truc comme ça
par exemple, ça irait ?

-------------------------------------------------------
rep="xxxx/tmp" # pour le choix du répertoire... à méditer.

if ! mountpoint "$rep"; then
mount -t tmpfs -o size=1M tmpfs "$rep"
fi

if sh -c "set -C; : > '$rep/pipeau'" 2>/dev/null; then
# c'est la première exécution
else
# c'est pas la première
fi
-------------------------------------------------------

Là, j'ai quand même la garantie d'avoir un "$rep" vide rien que pour moi
à chaque démarrage, non ?


--
François Lafont
Francois Lafont
Le #24466091
Le 10/05/2012 12:19, Doug713705 a écrit :

1. Suis-je sûr que /tmp/pipeau sera effacé au prochain démarrage ?



Efface le toi même avec un script executé lors de l'extinction du
système.



Comme j'expliquais dans un message précédent, j'aimerais bien rendre le
script auto-suffisant et ne pas faire intervenir autre chose.


--
François Lafont
Francois Lafont
Le #24466081
Le 10/05/2012 12:25, Lucas Levrel a écrit :
Le 10 mai 2012, Francois Lafont a écrit :

1. Suis-je sûr que /tmp/pipeau sera effacé au prochain démarrage ?



Clairement non. Mon /tmp est plein de fichiers temporaires « anciens »
(antérieurs au dernier démarrage) ; leur effacement est configurable
(opensuse 11.2) en fonction de l'âge.



Ah, et bien j'apprends quelque chose car je pensais que /tmp était
toujours vidé à chaque redémarrage.



--
François Lafont
Marc Boyer
Le #24466211
Le 10-05-2012, Francois Lafont
Bonjour à tous,

J'ai un script sur une Debian Squeeze qui s'exécute de temps en temps de
manière automatique (en fait à chaque fois que la fenêtre de connexion
apparaît, c'est-à-dire à chaque démarrage mais aussi après chaque
fermeture de session). L'exécution se fait via le compte root.

Je voudrais affiner le script pour qu'il se comporte légèrement
différemment suivant que l'exécution est la première depuis le dernier
démarrage ou non. Comment faire cela de manière fiable ?

J'avais pensé écrire un fichier « pipeau » dans /tmp, profitant du fait
que /tmp est vidé à chaque démarrage il me semble. Du coup, dans le
script, ça donnerait un truc dans le genre ça :

if [ -e /tmp/pipeau ]; then
# Alors ce n'est pas la première exécution
# depuis le dernier démarrage de la machine.
else
# Alors c'est la première exécution
# depuis le dernier démarrage de la machine.
# Du coup on crée le fichier.
touch /tmp/pipeau
fi

Mais je ne sais pas si c'est une bonne façon de faire :

1. Suis-je sûr que /tmp/pipeau sera effacé au prochain démarrage ?

2. Suis-je sûr qu'il ne peut pas être effacé à un moment donné alors
qu'il n'y a pas eu encore redémarrage ?

3. Lorsque je crée /tmp/pipeau, peut-être que ce fichier existe déjà
dans /tmp après tout (même si c'est hautement non probable) ?

Du coup, je me dis qu'on peut peut-être s'y prendre mieux que ça. :-)



Mon point de vue serait un peu différent: soit tu désires faire
un truc vraiment fiable, et il faut insérer ta commande dans la
liste des scripts exécutés au démarrage et à l'extinction de
ta machine, soit tu veux rester en dehors, et de manière moins
précise, tu peux par exemple comparer la date de création de
ton fichier avec l'uptime de la machine.

Et je mettrais plutôt tout ça dans /etc

Marc Boyer
--
À mesure que les inégalités regressent, les attentes se renforcent.
François Dubet
Publicité
Poster une réponse
Anonyme