Bash : Tester la connexion physique à un DD externe

Après avoir eu un problème lors d’une sauvegarde vers un DD ext, je voudrais compléter un script simple.
Historique :
J’ai lancé un script simple qui est censé sauvegarder ma Jessie sur un DD ext.
Habituellement, tout se passe parfaitement.
Cette fois, suite à des manips sur l’arrière de ma machine, le cable sata était débranché.
J’ai lancé ma sauvegarde comme habituellement, elle m’a paru longue mais je m’en suis rendu compte trop tard pour arrêter le processus.
En fait, comme le cable n’aboutissait pas à la machine, il semblerait que les données soient partie dans la nature.
Le lendemain, impossible de redémarrer.
J’avais une autre sauvegarde sur un DD interne, cette fois et là, moins de risque côté branchement.
J’ai pu restaurer sans trop de dégâts mais avec 15 jours d’écart. Pas trop grave, donc.

Je voudrais donc ajouter une ligne (ou 2-3) à ce script pour, qu’avant de lancer le transfert des données vers le DD externe, la connexion physique machine/DD ext soit contrôlée, et que l’on sorte du script si ladite connexion n’est pas effective.

Est-ce faisable et, si oui, quoi ajouter au script suivant ?

sudo mount -t ext4 /dev/sdb4 /mnt sudo rsync -av --del --exclude-from=/root/exclure / /mnt echo echo "sauve / terminé " echo sudo umount /mnt echo "sauve démonté"

Est-ce que tester le “montage” effectif est suffisant ?

Après ta commande mount il faudrait tester le retour de la commande

Et pour plus de sécurité ou comme alternative de vérification tu pourrais aussi vérifier que le montage est bien enregistrer et effectif.

Si le bout de code que tu as mis est celui qui a tourné avec le disque débranché toutes tes données doivent se trouver dans le répertoire “/mnt”

PS : ne pas copier/coller le code il est non fonctionnel en l’état.

Merci Mimoza.
Est-ce que tu veux dire quelque chose comme ça ?

[code]part-racine=’/dev/sdb4’

sudo mount -t ext4 $part-racine /mnt

$part-racine = 0

if (mount | grep sdb4 = 0)
sudo rsync -av …
exit
else
echo "blabla"
fi
exit[/code]

On peut cumuler les 2 verifications

[code]part-racine=’/dev/sdb4’

sudo mount -t ext4 $part-racine /mnt
if $?> 0
ech Erreur
exit 1

if (mount | grep sdb4 = 0)
sudo rsync -av …
exit
else
echo "blabla"
fi
exit[/code]

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

res = sudo mount -t ext4 $part-racine /mnt if res> 0

Que veux tu faire avec ca

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.