Bash : Tester la connexion physique à un DD externe

salut,

[quote]Tu peux aussi affecter le retour d’une commande dans une variable

res = sudo mount -t ext4 $part-racine /mnt[/quote]j’ai un doute : ça ne va plutôt enregistrer la sortie de la commande ?

En effet tu me met le doute aussi :016

Mimoza, je te confirme qu’avec le code var=$(commande), la variable var contiendra la sortie standard de la commande. Seule l’instruction $? nous permet de connaître la valeur de retour de la commande précédente.

Mimoza, tu es sûr d’écrire du sh ?

Non non non, c’est horribe, ça !

res=$(sudo mount -t ext4 $part-racine /mnt)
if [ "$res" -gt 0 ]
then
[...]
fi

est déjà plus syntaxiquement correct. Mais comme le dit flavien, la sortie d’erreur n’est pas enregistrée dans la variable.

Je vois trois moyens à partir d’ici. Exploiter la valeur de $?, combiner les commandes à l’aide de &&, ou interrompre le script en cas d’échec d’une commande (set -e).

Non clairement je savais que ce n’était pas du sh. Mais je n’avais rien pour tester a ce moment là, disons que c’était plus du pseudo-code. :mrgreen:

Concernant la demande originelle de ce fil, j’ai retrouvé un script que j’avais fait il y a 3 ou 4 ans et qui va très bien une fois testé :

[code]cible=’/dev/sdxy’

if [ ! -e $cible ]; then
echo "$cible est introuvable"
exit 1 # on sort
else
sudo mount -t ext4 $cible /mnt
fi

sudo rsync -av -…[/code]

Mais rien ne vous empêche de continuer votre dialogue.

Oui mais là tu teste juste si le disque est présent avant de le monter, tu ne controle pas si le montage a fonctionné ou non.

C’est la seule chose qui m’importait : voir le titre du fil.
Si le montage ne se fait pas, j’ai un refus de la commande mais ça ne m’est jamais arrivé.

J’ai quand même tenu compte de la vérification du montage dans mon script.
J’en ai fait un tuto
Il se veut volontairement simple mais explicite.
J’ai volontairement évité la multiplicité des variables pour ne pas rebuter les débutants.
Merci de votre aide.

Tiens, @ricardo, je me permets de te montrer comment je fais :

function test_mount() {

    echo "*** RSync::Test Mount USB ***"

	if [[ ! -d "/media/user/disk" ]]; then
		display bad_mount;
		exit;
	fi
}

Très simplement, et tout autant fonctionnel … :wink:

Oui, moi je teste l’absence au lieu de la présence et en plus, je teste le montage;
Il est vrai que ce sont deux approches différentes mais aussi simples.

`cibleH=’/dev/disk/by-partlabel/sauve-ricardo’

if [ ! -e $cibleH ]; then
echo “$cibleH est introuvable"
exit 1
else
sudo mount -t ext4 $cibleH $PtMontage
if ((”$?" > 0)); then
echo "erreur de montage"
exit 1
else
sudo rsync---------`

PS J’ai rétabli le bon lien du tuto ci-dessus

Attention qu’un mount sur une partition déjà montée retournera un code différent de 0. La meilleure façon de tester si une partition est montée est de tester l’existence d’un répertoire ou d’un fichier sur le mount ou bien encore de faire un grep de la cible sur la commande mount ou sur le fichier /etc/mtab

Ben c’est le but recherché.
* echo “erreur de montage”

  •     exit 1

Il veut dire que tu peut regarder plus finement ton montage avant de sortir en erreur.

  • Vérifier dans /etc/mtab si le montage existe déjà
  • Si oui sauter la commande mount
  • Sinon faire la commande mount
    • Si erreur de la commande mount sortir une erreur

Oui, je sais qu’on peut être plus pointu mais c’est justement ce que je veux éviter.
J’avais fait, il y a env. 5 ans, une usine à gaz. Tout était testé et pointu mais trop complexe.
Mon propos, pour ce script, c’est la simplicité.
Donc, il fonctionne parfaitement, avec un minimum de lignes et c’est ce que je veux.

Ce n’est pas plus pointu, c’est juste une précaution. Si ton DD externe est déjà monté (par automount par exemple) le test du mount de ton script renverra un code > 0 que ton script verra comme une erreur de montage alors que tout est normalement monté. Et ton rsync ne s’exécutera pas alors que rien ne s’y oppose.

C’est pourquoi je ne test que la présence du répertoire dans lequel il doit être monté …

Parce que s’il n’est pas connecté, le répertoire ne devrait pas exister. - oui, il peut arriver des erreurs de démontage ou d’écriture système qui font que, précédemment, le répertoire “reste” - heureusement, c’est assez rare.
S’il est monté, il peut ne pas être “redirigé” vers ce répertoire en question
S’il est monté correctement, il sera redirigé vers ce répertoire en question, donc la synchro pourra s’effectuer …

Après oui, on pourrait vérifier la présence avec un 'mount | grep '…
Personnellement, je trouve que vous vous compliquez beaucoup les choses - mais, si ça fonctionne tant mieux :wink:

C’est effectivement souvent suffisant, mais, comme tu le dis, pas toujours. Pour les puristes qui consulteront ce fil, la bonne manière de vérifier si un point de montage est monté est de vérifier avec un stat -c%d les numéros de périphérique du point de montage et de sa racine. S’ils sont différents, c’est monté, sinon pas.

Exemple:

MY_MNT="/mnt/point/de/montage" [ $(stat -c%d "$MY_MNT") -eq $(stat -c%d "$MY_MNT/..") ] && echo "pas monté" || echo "monté"

Personnellement j’utilise un grep sur /etc/mtab tout en sachant que ce n’est pas aussi robuste que le stat -c%d

De toutes les façons, le test sur le code de retour de la commande mount ne donne aucune indication sur le fait qu’un point est monté ou pas. Je répète qu’il peut renvoyer autre chose que 0 pour un mont parfaitement fonctionnel.

Sur le coup, je ne comprenais pas … puis j’ai testé !
Et, c’est normal qu’il soit différent puisque, quand tu fais appel à la deuxième écriture, soit ‘stat -c%d “$MY_MNT/…”’, tu appelles en fait le répertoire racine, précédent, - le répertoire parent auquel il est affilié - de ton répertoire monté !

Hors, pour pouvoir interroger le répertoire dit “parent”, il faut que le répertoire en question, soit monté, sinon, il ne peut interroger le parent de quelque chose qui n’existe pas !
Donc, s’il n’existe pas, il ne peut y avoir qu’équivalence, puisqu’en fait, on interroge le même parent …


Au fait, en passant, un puriste écrira : stat -c “%d” /repertoire/:wink:

Pas d’espace dans le format. Il n’est donc pas nécessaire de le protéger par des doubles quotes.