IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

Shell et commandes GNU Discussion :

Fonctionnement aléatoire de commandes système dans un script


Sujet :

Shell et commandes GNU

  1. #1
    Expert éminent sénior
    Avatar de Jipété
    Profil pro
    Inscrit en
    Juillet 2006
    Messages
    10 730
    Détails du profil
    Informations personnelles :
    Localisation : France, Hérault (Languedoc Roussillon)

    Informations forums :
    Inscription : Juillet 2006
    Messages : 10 730
    Points : 15 132
    Points
    15 132
    Par défaut Fonctionnement aléatoire de commandes système dans un script
    Bonjour,

    je suis en train d'automatiser la création de disques virtuels orientés VBox (fichiers .vdi, donc), et je vais de surprise en surprise, concernant le fonctionnement aléatoire de mon script.

    Certaines parties n'ont pas été touchées depuis plusieurs semaines, ce n'est pas sur elles que je travaille, et pourtant ce sont elles qui échouent, aléatoirement ; je me demande si ce n'est pas lié au multi-tâches et à d'autres choses similaires qui se passent dans notre dos et qu'on ne voit pas...

    Deux exemples :
    extrait 1
    Code BASH : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    sync
     
    # -2- connexion du fichier-disque
    echo "  connexion du fichier $fichier sur le point de montage $vdisque..."
    vdfuse -t VDI -f $fichier $vdisque > /dev/null 2>&1
    # erreur 1 intermittente ici, malgré le sync au dessus, et pourtant
    # mount montre que le fichier est monté ! Alors pourquoi erreur 1 ? 
    err=$?
    La solution (mais est-ce que le fait que ça fonctionne 10 ou 20 fois c'est valable ? Est-ce que ça ne va pas planter à la 21e fois ?) pour le moment consiste à rajouter sleep 0.5 juste avant l'appel à vdfuse mais franchement, ça fait chichi...
    Ça fait chichi parce que j'ai mis 0.5 complètement au pif, ça aurait pu être 0.8 ou 0.3, ou pourquoi pas 0.1 ou tout autant 10... J'aime pas les machins pifométriques

    Et question subsidiaire, à quoi sert sync s'il faut le compléter / le blinder par un sleep ?
    Quelqu'un connaît une autre commande, moins aléatoire et plus définitive ?

    extrait 2

    Code BASH : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    sync
     
    # -3b- formatage partition
    echo "  formatage de la partition $vdisque/$partoch..."
    mke2fs -q -t ext4 -F -F $vdisque/$partoch
    err=$?
    Même topo, un message d'erreur abscons généré par mke2fs que je n'avais jamais vu lors des précédents tests, solutionné (really ?) en rajoutant un sleep 0.5 après le sync qui termine / clôture l'étape précédente...

    Bonne journée,
    Il a à vivre sa vie comme ça et il est mûr sur ce mur se creusant la tête : peutêtre qu'il peut être sûr, etc.
    Oui, je milite pour l'orthographe et le respect du trait d'union à l'impératif.
    Après avoir posté, relisez-vous ! Et en cas d'erreur ou d'oubli, il existe un bouton « Modifier », à utiliser sans modération
    On a des lois pour protéger les remboursements aux faiseurs d’argent. On n’en a pas pour empêcher un être humain de mourir de misère.
    Mes 2 cts,
    --
    jp

  2. #2
    Expert éminent sénior Avatar de disedorgue
    Homme Profil pro
    Ingénieur intégration
    Inscrit en
    Décembre 2012
    Messages
    4 286
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Ingénieur intégration
    Secteur : High Tech - Opérateur de télécommunications

    Informations forums :
    Inscription : Décembre 2012
    Messages : 4 286
    Points : 12 742
    Points
    12 742
    Par défaut
    Bonjour,

    Pas trop de solution, sauf peut-être en faisant un second sync après un sleep.

    la commande sync flush tous les buffers ouvert sur disque mais n'attend pas necessairement que cela soit fini pour rendre la main:
    DESCRIPTION
    The sync() function writes all information in memory that
    should be on disk, including modified super blocks, modified
    inodes, and delayed block I/O.

    Unlike fsync(3C), which completes the writing before it
    returns, sync() schedules but does not necessarily complete
    the writing before returning.
    Cordialement.

  3. #3
    Expert éminent sénior
    Avatar de Escapetiger
    Homme Profil pro
    Administrateur système Unix - Linux
    Inscrit en
    Juillet 2012
    Messages
    1 477
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 61
    Localisation : France, Hauts de Seine (Île de France)

    Informations professionnelles :
    Activité : Administrateur système Unix - Linux

    Informations forums :
    Inscription : Juillet 2012
    Messages : 1 477
    Points : 11 057
    Points
    11 057
    Par défaut
    Citation Envoyé par Jipété Voir le message
    Et question subsidiaire, à quoi sert sync s'il faut le compléter / le blinder par un sleep ?
    Quelqu'un connaît une autre commande, moins aléatoire et plus définitive ?
    Salut Jipété,

    La question n'est pas du tout subsidiaire, sync sert à synchroniser l'écriture, la validation (on dirait le commit pour une base de données) pour le fs/partition qui peut avoir un temps de latence plus ou moins long :

    Une astuce d'administration au long cours "unixienne" pour le valider de façon quasi-sûre :
    sync ; sync qui "rends la main" une fois l'opération effectuée.

    [edit] On peut même essayer de blinder la commande par sync ; sync ; wait
    « Developpez.com est un groupe international de bénévoles dont la motivation est l'entraide au sens large » (incl. forums developpez.net)
    Club des professionnels en informatique

  4. #4
    Expert éminent sénior
    Avatar de Jipété
    Profil pro
    Inscrit en
    Juillet 2006
    Messages
    10 730
    Détails du profil
    Informations personnelles :
    Localisation : France, Hérault (Languedoc Roussillon)

    Informations forums :
    Inscription : Juillet 2006
    Messages : 10 730
    Points : 15 132
    Points
    15 132
    Par défaut
    Merci pour vos retours,

    Citation Envoyé par disedorgue Voir le message
    la commande sync flush tous les buffers ouvert sur disque mais n'attend pas nécessairement que cela soit fini pour rendre la main:
    DESCRIPTION
    The sync() function writes all information in memory that
    should be on disk, including modified super blocks, modified
    inodes, and delayed block I/O.

    Unlike fsync(3C), which completes the writing before it
    returns, sync() schedules but does not necessarily complete
    the writing before returning.
    Où as-tu trouvé ces détails croustillants ?
    Mon man ne les affiche pas. Tu es allé fouiller dans le code source ? S'il faut faire ça avec toutes les commandes externes, la rédaction de scripts ne va pas être très productive,


    Citation Envoyé par Escapetiger Voir le message
    On peut même essayer de blinder la commande par sync ; sync ; wait
    Je vais sans doute tenter cette voie, merci pour le tuyau, merci pour les infos !
    Il a à vivre sa vie comme ça et il est mûr sur ce mur se creusant la tête : peutêtre qu'il peut être sûr, etc.
    Oui, je milite pour l'orthographe et le respect du trait d'union à l'impératif.
    Après avoir posté, relisez-vous ! Et en cas d'erreur ou d'oubli, il existe un bouton « Modifier », à utiliser sans modération
    On a des lois pour protéger les remboursements aux faiseurs d’argent. On n’en a pas pour empêcher un être humain de mourir de misère.
    Mes 2 cts,
    --
    jp

  5. #5
    Expert éminent sénior Avatar de disedorgue
    Homme Profil pro
    Ingénieur intégration
    Inscrit en
    Décembre 2012
    Messages
    4 286
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Ingénieur intégration
    Secteur : High Tech - Opérateur de télécommunications

    Informations forums :
    Inscription : Décembre 2012
    Messages : 4 286
    Points : 12 742
    Points
    12 742
    Par défaut
    Je reconnais que ce n'est pas le man de linux mais d'un solaris
    Cordialement.

  6. #6
    Expert éminent sénior
    Avatar de Jipété
    Profil pro
    Inscrit en
    Juillet 2006
    Messages
    10 730
    Détails du profil
    Informations personnelles :
    Localisation : France, Hérault (Languedoc Roussillon)

    Informations forums :
    Inscription : Juillet 2006
    Messages : 10 730
    Points : 15 132
    Points
    15 132
    Par défaut
    Bonjour,

    je déterre cette discussion car cette histoire de délai pifométrique ne me convenant pas trop, intellectuellement parlant, comme j'avais 5 minutes j'ai fouillé et je suis tombé sur... une légende urbaine, désolé Escapetiger :
    Citation Envoyé par Escapetiger Voir le message
    On peut même essayer de blinder la commande par sync ; sync ; wait
    Mais il y a un fond de vérité, un peu de lecture ici et là et encore là.

    Le plus ennuyeux àmha c'est que si j'ai bien compris, l'appel de sync demande au kernel de dire au pilote du disque de vider ses buffers, mais ensuite le disque prend le temps dont il a besoin pour faire le taf hardware, ce qui est toujours plus long que le retour de la fonction, d'où ce délai que j'avais constaté empiriquement et que d'autres ont noté également, ce qui est ennuyeux car on n'a aucun moyen de savoir quand le disque a vraiment fini d'écrire...
    Extrait du /usr/src/linux_version/fs/sync.c :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    /*
     * Finally, we writeout all block devices because some filesystems (e.g. ext2)
     * just write metadata (such as inodes or bitmaps) to block device page cache
     * and do not sync it on their own in ->sync_fs().
     */
    Il faudrait peut-être aller explorer les internals profond profond des pilotes de disque, ce qui me dépasse grave.
    Dans l'attente et en manière de contournement, sync; sleep(1) comme je l'avais supposé devrait être suffisant et moins marabouté que sync; sync; wait je pense, d'autant plus que l'appel kernel le fait déjà deux fois de lui-même (voir la proc do_sync_work).

    That's all, folks !
    Il a à vivre sa vie comme ça et il est mûr sur ce mur se creusant la tête : peutêtre qu'il peut être sûr, etc.
    Oui, je milite pour l'orthographe et le respect du trait d'union à l'impératif.
    Après avoir posté, relisez-vous ! Et en cas d'erreur ou d'oubli, il existe un bouton « Modifier », à utiliser sans modération
    On a des lois pour protéger les remboursements aux faiseurs d’argent. On n’en a pas pour empêcher un être humain de mourir de misère.
    Mes 2 cts,
    --
    jp

  7. #7
    Expert éminent sénior
    Avatar de Escapetiger
    Homme Profil pro
    Administrateur système Unix - Linux
    Inscrit en
    Juillet 2012
    Messages
    1 477
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 61
    Localisation : France, Hauts de Seine (Île de France)

    Informations professionnelles :
    Activité : Administrateur système Unix - Linux

    Informations forums :
    Inscription : Juillet 2012
    Messages : 1 477
    Points : 11 057
    Points
    11 057
    Par défaut
    Citation Envoyé par Jipété Voir le message
    (...)
    je déterre cette discussion car cette histoire de délai pifométrique ne me convenant pas trop, intellectuellement parlant, comme j'avais 5 minutes j'ai fouillé et je suis tombé sur... une légende urbaine, désolé Escapetiger :
    (...)
    Mais il y a un fond de vérité, un peu de lecture ...
    Pas de souci Jipété & disedorgue, merci pour ces liens oh combien instructifs, ces habitudes étaient un moyen empirique, en production, également de se prémunir par rapport aux technologies de l 'époque...
    Citation Envoyé par Jipété Voir le message
    Le plus ennuyeux àmha c'est que si j'ai bien compris, l'appel de sync demande au kernel de dire au pilote du disque de vider ses buffers, mais ensuite le disque prend le temps dont il a besoin pour faire le taf hardware, ce qui est toujours plus long que le retour de la fonction, d'où ce délai que j'avais constaté empiriquement et que d'autres ont noté également, ce qui est ennuyeux car on n'a aucun moyen de savoir quand le disque a vraiment fini d'écrire...
    Tout à fait et c'est là, que "ta" problématique rejoint les contraintes de type temps-réel, abordées en leur temps par exemple (ce n'est pas du Linux mais du "Sun/Solaris") comme avec l'OS Chorus :

    https://fr.wikipedia.org/wiki/ChorusOS

    ps :
    Je rectifie, le wait n'est pas approprié, il s'agissait d'un troisième sync

    ps 2:
    Sun Microsystems rachète le français Chorus Systèmes
    Les Echos | Le 11/09/1997
    « Developpez.com est un groupe international de bénévoles dont la motivation est l'entraide au sens large » (incl. forums developpez.net)
    Club des professionnels en informatique

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. Execution d'une commande telnet dans un script sh
    Par Nospher dans le forum Linux
    Réponses: 17
    Dernier message: 23/08/2011, 15h30
  2. [cURL] Lancer une commande curl dans un script php
    Par griese dans le forum Bibliothèques et frameworks
    Réponses: 7
    Dernier message: 22/03/2007, 10h52
  3. Réponses: 5
    Dernier message: 16/03/2007, 12h16
  4. Réponses: 1
    Dernier message: 14/03/2007, 15h56
  5. Masquer une commande système dans python
    Par Mysti¢ dans le forum Général Python
    Réponses: 5
    Dernier message: 03/11/2006, 16h33

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo