c'est un gros foutoir, le scripting, je ne vois que ça...
le deuxième sync n'a pas d'utilité, il me semble. par contre, celui qui est réalisé avant le blkid lui peut être indispensable.
du coup, le scripting est innocent !
c'est un gros foutoir, le scripting, je ne vois que ça...
le deuxième sync n'a pas d'utilité, il me semble. par contre, celui qui est réalisé avant le blkid lui peut être indispensable.
du coup, le scripting est innocent !
Le man de blkid lui-même décourage l'utilisation de cette commande. Donc bon.
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3 Lutilisation de la commande lsblk(8) est préférable à blkid pour obtenir des renseignements sur les périphériques bloc. (...) lsblk(8) est aussi facile dutilisation dans les scripts.
Oui, mais...
PNAME au pif, pour voir si ça mordait puisque PKNAME est inconnu.
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6 $ lsblk -o NAME,PARTLABEL,MOUNTPOINT,SIZE,UUID,FSTYPE /dev/nbd??* lsblk: colonne inconnue : PARTLABEL,MOUNTPOINT,SIZE,UUID,FSTYPE $ lsblk -o PKNAME,LABEL,MOUNTPOINT,SIZE,UUID,FSTYPE /dev/nbd??* lsblk: colonne inconnue : PKNAME,LABEL,MOUNTPOINT,SIZE,UUID,FSTYPE $ lsblk -o PNAME,LABEL,MOUNTPOINT,SIZE,UUID,FSTYPE /dev/nbd??* lsblk: colonne inconnue : PNAME,LABEL,MOUNTPOINT,SIZE,UUID,FSTYPE
Et cet outil est chatouilleux sur la syntaxe :
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7 $ lsblk -no NAME,LABEL,SIZE,UUID,FSTYPE /dev/nbd??* nbd0p1 25mo 25M 9d75ee8c-97cf-40b6-9e6a-308e44e6dc22 ext4 nbd0p2 15mo 15M 6f2e4fd4-9e0a-46fa-aebb-83c90e94f679 ext4 nbd0p3 12mo 12M 7f5fd0e0-6adf-4cfd-977b-67a254f275a3 ext4 nbd0p4 07mo 7M b4944abf-684e-45ad-9807-1e8e76d577c0 ext4 $ lsblk -on NAME,LABEL,SIZE,UUID,FSTYPE /dev/nbd??* lsblk: colonne inconnue : n
Vu : je l'ai supprimé et ça a l'air de tenir la route.
Amusant.
J'ai remplacé la ligne avec blkid par la même (testée dans une console) avec lsblk :
mais ça plante avec une erreur 1 et rien dans l'aide n'explique à quoi ça correspond...
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6 tempfic=$(mktemp /tmp/test.XXX) sync #blkid /dev/nbd* > "$tempfic" lsblk -no NAME,LABEL,FSTYPE /dev/nbd??* > "$tempfic" ret=$(echo $?) if [ "$ret" == "0" ]; then cat "$tempfic"
Solution (à moins que quelqu'un n'ait mieux) :
Code : Sélectionner tout - Visualiser dans une fenêtre à part lsblk -no NAME,LABEL,FSTYPE /dev/nbd??* | { mapfile -t; printf "/dev/%s\n" "${MAPFILE[@]}";} > "$tempfic"
je le redis : cette façon de faire n'est pas pertinente.
il faut débugger cette partie du script : place un set -x avant la création du fichier temporaire, et un set +x après le lsblk, et affiche-nous le résultat. On verra.mais ça plante avec une erreur 1 et rien dans l'aide n'explique à quoi ça correspond...
Je rêve. C'est la syntaxe toute entière des commandes bash qui est comme cela. les options de commande ont, ou n'ont pas, des paramètres. Si tu ne donnes pas les paramètres à une option qui en demande, cela plantera toujours. "-o" est une option à paramètre pour lsblk.Et cet outil est chatouilleux sur la syntaxe :
Voilà voilà, le souci c'est qu'après un arrêt suivi d'un redémarrage 3 heures plus tard, le problème de l'erreur 1 a disparu...
Bref, du début du script (chaque fonction loggue son entrée) jusqu'au set +x :
Et le code utilisé pour ça :
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
11
12
13 début de main insert_nbd qemu_up qemu-nbd ok check_parts avec lsblk : ++ mktemp /tmp/test.XXX + tempfic=/tmp/test.UDb + sync + mapfile -t + lsblk -no NAME,LABEL,FSTYPE /dev/nbd0p1 /dev/nbd0p2 /dev/nbd0p3 /dev/nbd0p4 /dev/nbd10 /dev/nbd11 /dev/nbd12 /dev/nbd13 /dev/nbd14 /dev/nbd15 + printf '/dev/%s\n' 'nbd0p1 25mo ext4' 'nbd0p2 15mo ext4' 'nbd0p3 12mo ext4' 'nbd0p4 07mo ext4' + set +x
Et pour comparer, la commande tapée dans un terminal et la sortie associée :
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5 set -x tempfic=$(mktemp /tmp/test.XXX) sync lsblk -no NAME,LABEL,FSTYPE /dev/nbd??* | { mapfile -t; printf "/dev/%s\n" "${MAPFILE[@]}";} > "$tempfic" set +x
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5 $ lsblk -no NAME,LABEL,FSTYPE /dev/nbd??* nbd0p1 25mo ext4 nbd0p2 15mo ext4 nbd0p3 12mo ext4 nbd0p4 07mo ext4
Sans doute, mais ça n'est pas indiqué dans l'aide...
"liste" est le paramètre de "-o" ou de "--output"Envoyé par man lsblk
essayes du standard:
L'option -p de lsblk affiche le chemin complet du device.
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2 udevadm settle lsblk -npo NAME,LABEL,FSTYPE /dev/nbd??*
la commande juste avant vient de cette remarque:
Note that lsblk might be executed in time when udev does not have all
information about recently added or modified devices yet. In this case
it is recommended to use udevadm settle before lsblk to synchronize
with udev
ça à l'air bon. il faudrait nous montrer quand ce n'est pas bon.Envoyé par Jipété
àmha, hormis la façon dont tu te sers du shell (je ne vais plus insister), le problème ne vient pas du script, mais d'une "instabilité" de ton système : parfois il vois tout, parfois pas. :/
pour l'observer, tu peux taper une simple commande (blkid, ou lsblk, mais la même dont tu te sers pour récupérer les données (!)). on verra si c'est le script (peu probable), ou le système le fautif.
Bonjour,
T'inquiètes pas pour ça, c'est bien noté depuis hier,
Mais pour le moment, ça n'a pas coincé une seule fois ce matin.
Ce dernier paragraphe fait-il référence à "une simple commande" dans une console en dehors du script, ou à une ligne supplémentaire dans le script ?
Je découvre cette option ("settle"), donc man udevadm et je lis Watches the udev event queue, and exits if all current events are handled. et je ne te cache pas que j'aurais préféré lire Watches the udev event queue, and exits when all current events are handled.
Parce que de base, que fait udevadm si les current events ne sont pas tous handled ? Rien ne le dit.
Et l'option "p" n'existant pas dans la vieille version de lsblk que j'utilise dans la vieille machine toujours en prod' (waiting for l'autre), je vous prie donc de m'excuser sur ce coup-là.
J'ai tenté mais n'ayant pas trouvé d'exemple de ligne de commande limpide, je me suis vite retrouvé face au mur et ça fait mal et ça ne doit pas arranger les histoires de timing de blkid/lsblk.
Correction : en relisant toute la discussion, je découvre ton edit dans ton post #7 que je n'avais pas vu auparavant,
je l'adapte à mes besoins :
et en console comme dans le script, c'est tout bon :
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2 mapfile -t parts < <(lsblk -n -l -o KNAME,LABEL,FSTYPE /dev/nbd??*) printf "/dev/%s\n" "${parts[@]}"
Et du post # 9 :
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4 /dev/nbd0p1 25mo ext4 /dev/nbd0p2 15mo ext4 /dev/nbd0p3 12mo ext4 /dev/nbd0p4 07mo ext4
Un exemple, stp.
oui, insérer une commande supplémentaire, pour voir dans le déroulement du script si la commande affiche des données différentes avant le traitement.
L'intérêt de tout mettre dans un tableau, c'est aussi que tu peux facilement avoir le nombre d'éléments avec ${#parts[@]} (sans faire une boucle incrémentant un compteur).
De plus, comme je n'ai pas de 'mapfile' sous mac os (ni lsblk d'ailleurs), j'essaie d'utiliser un tableau directement (et basiquement).
Peux-tu nous dire ce que donne le code suivant chez toi ?
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3 IFS=$'\n' parts=( $(lsblk -n -l -o KNAME,LABEL,FSTYPE /dev/nbd??*) ) printf "/dev/%s\n" "${parts[@]}" printf "/dev/%s\n" "${#parts[@]}" # avec le '#' pour avoir la taille du tableau
ça donne que l'IFS est malgré tout redéfini globalement.
Qu'on doit pouvoir contourner avec
avec mon disque à 4 partoches :
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3 OLDIFS="$IFS" code_utilisant_un_autre_IFS IFS="$OLDIFS"
et ça plante avec des disques sans partoche grace au set -u en début de script :
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5 /dev/nbd0p1 25mo ext4 /dev/nbd0p2 15mo ext4 /dev/nbd0p3 12mo ext4 /dev/nbd0p4 07mo ext4 /dev/4
./mountfile.sh: parts[@] : variable sans liaison (correspond à la ligne printf "/dev/%s\n" "${parts[@]}")
Mais je me tate pour ne pas retourner vers blkid, malgré l'alerte de flodelarab, car, mine de rien, on le trouve au début de fstab :
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5 # /etc/fstab: static file system information. # # Use 'blkid' to print the universally unique identifier for a # device; this may be used with UUID= as a more robust way to name devices # that works even if disks are added and removed. See fstab(5).
Salut Jipété,
Ton topic me rappelais quelque chose sur developpez jusqu'à ce que je retrouve le sujet concomitant ci-dessous, peut-être est-ce une piste à explorer par chez toi sous réserve de ma compréhension de la probématique initiale après une relecture de l'ensemble du sujet :
(.../...)
Source :
Afficher la partition du système actif - Administration système
[Edit]
Man page 8 : findmnt
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93 $ findmnt --help Utilisation : findmnt [options] findmnt [options] <périphérique> | <pointdemontage> findmnt [options] <périphérique> <pointdemontage> findmnt [options] [--source <périphérique>] [--target <pointdemontage> | --mountpoint <rép>] Trouver un système de fichiers (monté). Options*: -s, --fstab chercher dans la table statique des systèmes de fichiers -m, --mtab search in table of mounted filesystems (includes user space mount options) -k, --kernel rechercher dans la table du noyau des systèmes de fichiers montés (par défaut) -p, --poll[=<liste>] surveiller les modifications dans la table des systèmes de fichiers montés -w, --timeout <nombre> limite maximale en milliseconde que --poll bloquera -A, --all désactiver tous les filtres intégrés, afficher tous les systèmes de fichiers -a, --ascii utiliser des caractères ASCII pour l'arborescence -b, --bytes afficher les tailles en octet plutôt qu'en format lisible -C, --nocanonicalize ne pas canoniser les chemins lors d’une comparaison -c, --canonicalize affichage des chemins canoniques -D, --df imiter la sortie de df(1) -d, --direction <mot> direction de recherche*: «*forward*» ou «*backward*» -e, --evaluate convertir toutes les étiquettes (LABEL, UUID, PARTUUID, PARTLABEL) en noms de périphérique -F, --tab-file <chem.> autre fichier pour les options -s, -m ou -k -f, --first-only n'afficher que le premier système de fichiers trouvé -i, --invert inverser le sens de correspondance -J, --json utiliser le format de sortie JSON -l, --list utiliser le format de sortie en liste -N, --task <tid> utiliser l'espace de noms alternatif (fichier /proc/<tid>/mountinfo) -n, --noheadings ne pas afficher les en-têtes de colonne -O, --options <liste> limiter l'ensemble de systèmes de fichiers par options de montage -o, --output <liste> les colonnes de sortie à montrer --output-all output all available columns -P, --pairs utiliser le format de sortie clef="valeur" --pseudo print only pseudo-filesystems -R, --submounts afficher tous les sous-montages des systèmes de fichiers correspondants -r, --raw utiliser le format de sortie brut --real print only real filesystems -S, --source <chaîne> le périphérique à monter (par nom, maj:min, LABEL=, UUID=, PARTUUID= ou PARTLABEL=) -T, --target <chemin> le chemin du système de fichier à utiliser --tree enable tree format output is possible -M, --mountpoint <rép.> définir le répertoire de montage -t, --types <liste> limiter l'ensemble de systèmes de fichiers par types -U, --uniq ignorer les systèmes de fichiers avec plusieurs cibles -u, --notruncate ne pas tronquer le texte des colonnes -v, --nofsroot ne pas afficher [/rép] pour les montages bind ou Btrfs -X, --verify vérifier le contenu de la table de montage (fstab par défaut) --verbose afficher en mode bavard -h, --help display this help -V, --version display version Available output columns: SOURCE périphérique source TARGET point de montage FSTYPE type de système de fichiers OPTIONS toutes les options de montage VFS-OPTIONS options de montage spécifiques au VFS FS-OPTIONS options de montage spécifiques au système de fichiers LABEL étiquette du système de fichiers UUID UUID du système de fichiers PARTLABEL étiquette de partition PARTUUID UUID de partition MAJ:MIN numéro majeur:mineur du périphérique ACTION action détectée par --poll OLD-TARGET ancien point de montage sauvegardé par --poll OLD-OPTIONS ancienne options de montage sauvegardée par --poll SIZE taille du système de fichiers AVAIL taille disponible sur le système de fichiers USED taille utilisée du système de fichiers USE% pourcentage d'utilisation du système de fichiers FSROOT système de fichiers racine TID identifiant de tâche ID identifiant de montage OPT-FIELDS champs de montage facultatifs PROPAGATION indicateurs de propagation VFS FREQ période de dump(8) en jour [seulement pour fstab] PASSNO nombre de passes en fsck(8) parallèle [seulement pour fstab] Consultez findmnt(8) pour obtenir des précisions complémentaires.
Yep !
OMG, tu ressuscites un sujet qui a 18 mois, autant dire une éternité, et après l'avoir (un peu) relu, j'avoue humblement que je ne me souviens plus pourquoi c'était faire !
Tu vois le truc ?
Entre de + en + de binaires qui ont de + en + d'options, et l'âge qui passe pour nous bouffer les neurones, on ne peut que s'évanouir face à l'écart qui s'agrandit, jour après jour,
Mais merci d'y avoir pensé, c'est vrai que j'ai sur mon bureau depuis plus d'un an une note pour penser à étudier findmnt en profondeur. Dès que j'ai 5 minutes, promis !
Vous avez un bloqueur de publicités installé.
Le Club Developpez.com n'affiche que des publicités IT, discrètes et non intrusives.
Afin que nous puissions continuer à vous fournir gratuitement du contenu de qualité, merci de nous soutenir en désactivant votre bloqueur de publicités sur Developpez.com.
Partager