Note que ceci suppose que ta partition n’est jamais montée avant que tu lances le script.
En effet, si la partition est déjà montée, mount renverra un code d’erreur, et le script se terminera alors qu’il aurait pu continuer. Il faut donc exclure ce cas de figure, par exemple :
if ! grep -q "^$ddext $mount_rep $system_fich" /etc/mtab ; then
sudo mount -t "$systeme_fich" "$ddext" "$mount_rep" || exit 1
else
echo "Info : La partition est déjà montée."
fi
Oui, tu as raison dans l’absolu et j’y avais pensé.
Toutefois, je pars du principe que ces partitions ne servent qu’à la sauvegarde selon ce script et comme il se termine par un démontage, cette hypothèse ne devrait pas se produire.
Sauf, il est vrai, en cas de “besoin” de ladite sauvegarde
À voir !
Ça doit être différent dans le cas d’un partage CIFS :
Chez moi :
$ mount /mnt/films/ ; echo $?
mount : /dev/sdc1 est déjà monté ou /mnt/films est occupé
mount : selon mtab, /dev/sdc1 est déjà monté sur /mnt/films
32
$ mount -V
mount from util-linux 2.19.1 (with libblkid support)
[quote]case $part in
sauve)
sudo mount -t “$systeme_fich” “$ddext” “$mount_rep” || exit 1;[/quote]
d’où ma question :
ce ‘exit 1’ est-il variement indispensable ?
Il n’a été placé là que pour pallier un éventuel défaut de montage. On sait que la partition est présente, on connaît, et on a testé, la commande de montage. Y-a-t-il beaucoup de possibilité que le montage ne s’effectue pas ?
Bien sûr, ce que propose Kna irait bien mais “alourdir” le script avec une condition supplémentaire pour un cas plus qu’improbable … est-ce nécessaire ?
Avec la suppression pure et simple de ce ‘exit 1’, si la partoche est déjà montée, ça sera ptet indiqué mais comme ça ne sort pas, le processus devrait quand même aboutir, non ?
Je vais tester ce dernier point.
EDIT :
Test effectué (après suppression de ‘exit 1’) en montant d’abord la partition : le montage déjà fait est indiqué mais le processus continue jusqu’au bout des sauvegardes et sans erreurs.
Je réitère donc :
“défaut de montage” : peu probable et on l’oubli en supprimant le ‘exit 1’
ou
on ajoute la condition de Kna en conservant le ‘exit 1’
ou
une autre possiblilité ???
1er point :
Lorsqu’il s’agit d’une partition de type ext3 ou ext4, j’ai le même comportement que vous lorsqu’il s’agit de la monter sur un dossier où elle est déjà montée (mea-culpa ). A noter qu’il est possible de monter la même partition sur des points de montage différents en même temps.
2nd point : (Je pars du principe que ce script ne sera pas utilisé exclusivement par ricardo.)
1er cas (Erreur de montage) :
Comme évoqué auparavant, le montage peut échouer pour des raisons de viabilité de la partition ou en raison de permissions insuffisantes (ce sont les erreurs les plus fréquentes). Mais en soit, ce n’est pas vraiment gênant car la sauvegarde aura bien lieu. En effet, le point de montage existant, rsync n’y verra que du feu dès lors qu’il y a suffisamment de place sur la partition contenant ${mount_rep} ! Mais n’est t’il pas préférable de prévenir l’utilisateur que la sauvegarde n’aura pas lieu sur la partition qu’il a choisie ?
2nd cas (la partition est déjà montée) : il est tout de même préférable de ne pas la démonter en sortant du script (C’est un principe : remettre le système dans le même état qu’il était avant exécution du script). Il y a probablement une raison à ce qu’elle soit montée.
Donc, à mon sens :
il est bon de vérifier que la partition est déjà ou non montée pour ne pas la démonter si elle l’était déjà. --> il faut tester avant le mount.
ne pas vérifier que le montage n’ait pas eu lieu peut faire penser à l’utilisateur que sa sauvegarde est bien sur sa partition de sauvegarde alors que ce n’est pas le cas. --> il faut tester le mount !
Rajouter la condition n’alourdira pas le script. C’est vraiment pas grand chose et bien au contraire, tu fiabiliseras le comportement du script.
Dans ce cas, je pense qu’il est préférable de faire un appel à sync pour s’assurer que les données ont bien étaient écrite sur la partition.
En effet dans si l’utilisateur ne s’est pas rendu compte qu’il avait déjà monté sa partition, il peut la retirer en pensant que le script l’a démontée. C’est rarement grave, sauf pour les gros fichiers qui mettent du temps à être écris.
On va donc placer la condition de Kna mais des questions avant :
1/ il faut bien la mettre deux fois, une pour chaque choix de partition (sauve et sauve2) ?
2/ qu’indique le ‘^’ , qu’il ne doit manquer aucun des éléments suivants dans la ligne ?
[quote]if ! grep -q “^$ddext $mount_rep $system_fich” /etc/mtab ; then
sudo mount -t “$systeme_fich” “$ddext” “$mount_rep” || exit 1
else
echo "Info : La partition est déjà montée."
fi[/quote]
3/ le ‘else’ veut dire que la partition est déjà monté, donc il ne la monte pas et le processus continue, c’est parfait mais à la fin de la sauvegarde, la dernière commande “démonte” ladite partition.
Ce qui tombe en désaccord avec le principe indiqué par Totor, de rendre les choses dans l’état où elles étaient quand on les a trouvées.
Si j’ai raison, ptet qu’un simple ajout à l’avertissement : “Info : La partition est déjà montée.”, du genre “… mais elle sera démontée à la fin de la sauvegarde”, suffirait ?
Dans l’absolu oui ! Mais dans le même principe que le test de sauvegarde, une fonction serait pas mal
le ^ indique que le motif à rechercher dans le fichier /etc/mtab doit se trouver en début de ligne. Dans notre cas, le motif est $ddext $mount_rep $system_fich
[quote=“ricardo”]
3/ le ‘else’ veut dire que la partition est déjà monté, donc il ne la monte pas et le processus continue, c’est parfait mais à la fin de la sauvegarde, la dernière commande “démonte” ladite partition.
Ce qui tombe en désaccord avec le principe indiqué par Totor, de rendre les choses dans l’état où elles étaient quand on les a trouvées.
Si j’ai raison, ptet qu’un simple ajout à l’avertissement : “Info : La partition est déjà montée.”, du genre “… mais elle sera démontée à la fin de la sauvegarde”, suffirait ?[/quote]
Le ‘else’ ne fait qu’afficher un message dans le cas où la partition est déjà montée. Donc dans ce cas il faudrait conserver cette information pour ne pas démonter la partition en fin de script. Pour cela, il “suffit” d’alimenter une variable avec une valeur (de ton choix) qui signifie : “la partition était déjà montée”. Bien sûr, dans le cas contraire, cette même variable devrait avoir une valeur différente.
Ainsi, avant de démonter la partition, un petit test sur la valeur de cette variable t’indiquera s’il faut où non la démonter (ou faire un “sync” comme l’a judicieusement proposé MisterFreez)
[quote=“Totor”] une fonction serait pas mal [/quote] J’vais essayer
[quote=“Totor”]indique que le motif à rechercher dans le fichier /etc/mtab doit se trouver en début de ligne. Dans notre cas, le motif est $ddext $mount_rep $system_fich[/quote]J’avais bien vu ça dans le man mais j’avais mal interprété.
[quote=“Totor”]Le ‘else’ ne fait qu’afficher un message dans le cas où la partition est déjà montée. Donc dans ce cas il faudrait conserver cette information pour ne pas démonter la partition en fin de script. Pour cela, il “suffit” d’alimenter une variable avec une valeur (de ton choix) qui signifie : “la partition était déjà montée”. Bien sûr, dans le cas contraire, cette même variable devrait avoir une valeur différente.
Ainsi, avant de démonter la partition, un petit test sur la valeur de cette variable t’indiquera s’il faut où non la démonter (ou faire un “sync” comme l’a judicieusement proposé MisterFreez)[/quote]Une explication plus poussée sur ce “sync”, avec exemple, si possible ? merci
En gros, lorsque tu copies des fichiers, ils ne sont pas aussitôt copiés physiquement sur le disque, mais dans un tampon. Le système choisit à quel moment il va réèllement copier les fichiers, de façon à obtenir de meilleures performances.
La commande sync force le système à vider ce tampon et à copier les fichiers vers leur destination. Typiquement, umount le fait avant de démonter une partition (et c’est pourquoi il faut toujours démonter la partition avant de débrancher un disque externe).
Ce que propose MisterFreez, c’est que le script fasse un sync seul, s’il ne démonte pas la partition. Ainsi, tu ne risque pas de perdre des données si tu débranches le disque en oubliant que la partition est encore montée.
et pour l’exemple, c’est pas bien compliqué. sync est le nom d’une commande qui n’a pas besoin d’argument/paramètre (hormis –help pour afficher l’aide et –version pour afficher la version de la commande). Ainsi, tu as juste à rajouter sync à la fin de ton script lorsque la partition était déjà montée.
Je me permet une discutions, j’espère que bientôt la commande sync pourras prendre un argument pour choisir la partition que l’on veut « flusher » (actuellement ça le fait pour toute, à partir de linux 3 le noyau à tout ce qu’il faut pour le faire). Ca permettras de ne pas impacter le reste du système et d’être plus léger et court.
Sinon pour la théorie, on dit que ce mécanisme de temporisation rend l’écriture asynchrone, généralement on cherche à avoir les lectures synchrones et les écritures asynchrones.
[quote=“Totor”][quote=“ricardo”]
1/ il faut bien la mettre deux fois, une pour chaque choix de partition (sauve et sauve2) ?
[/quote]
Dans l’absolu oui ! Mais dans le même principe que le test de sauvegarde, une fonction serait pas mal[/quote]
Ça fait 1 heure que je cherche comment intégrer cette fonction et je sature.
Tu me dis, et ça je comprends, qu’il faut faire le test de Kna AVANT la commande de montage de la partition : OK
On aurait donc :
function test_montage_partition()
{
if ! grep -q "^$ddext $mount_rep $system_fich" /etc/mtab ; then
sudo mount -t "$systeme_fich" "$ddext" "$mount_rep" || exit 1;
else
echo "Info : La partition est déjà montée."
fi
}
à intégrer à :
read -p 'sauve ou sauve2 ? : ' part
case $part in
sauve)
test_montage_partition XXX YYY
sudo mount -t "$systeme_fich" "$ddext" "$mount_rep" || exit 1;
;;
sauve2)
test_montage_partition XXX YYY
sudo mount -t "$systeme_fich2" "$ddext2" "$mount_rep" || exit 1;
;;
*)
echo "mauvaise entrée" >&2; exit 1;
;;
esac
Moi, dans ma ptite tête, je vois la fonction ainsi :
si la ligne est absente de mtab; then
exit 0
sinon
blabla
donc on reprend la suite du case, càd
sudo mount -t “$systeme_fich” “$ddext” “$mount_rep” || exit 1;
function test_montage_partition()
{
if ! grep -q "^$ddext $mount_rep $system_fich" /etc/mtab ; then
sudo mount -t "$systeme_fich" "$ddext" "$mount_rep" || exit 1;
else
echo "Info : La partition est déjà montée."
fi
}
[ul]
[li]Tu ne prends pas en compte les paramètres de ta fonction.[/li]
[li]« exit » va te faire quitter ton programme, ce n’est pas ce que tu souhaite. Pour quitter une fonction tu peut utiliser return mais ce n’est pas utile ici.[/li][/ul]
le type de système de fichier de la partition à monter : systeme_fich / systeme_fich2
la partition à monter : ddext / ddext2
le point de montage : mount_rep
parmi ces 3 paramètres, il y en 2 qui dépendent du type de sauvegarde (sauve ou sauve2) :
le type de fs
la partition
mais l’on pourrait considérer que le point de montage diffère également selon le type de sauvegarde.
dans ces conditions, les 3 paramètres attendus pour le mount sont autant de données variables nécessaires à la fonction. c.a.d autant de paramètres en entrée.
elle devient donc :
function test_montage_partition()
{
# $1 = type de fs
# $2 = partition à monter
# $3 = point de montage
if ! grep -q "^$2 $3 $1" /etc/mtab ; then
sudo mount -t "$1" "$2" "$3" || exit 1;
else
echo "Info : La partition est déjà montée."
fi
}
Ensuite, il faut que cette fonction retourne l’information : "la partition était t’elle déjà montée ?"
Pour cela, on va s’appuyer sur le statut qu’elle va retourner.
On connait le fonctionnement du “exit” : il quitte le script en spécifiant un statut d’exécution.
L’équivalent pour les fonctions est return (Il permet donc de quitter la fonction tout en spécifiant son statut d’exécution).
On va considérer que si la fonction se termine avec le statut
0, c’est que le montage a eu lieu
1, c’est que la partition était déjà montée
Si il y a eu une erreur lors du montage, on sait que le script se termine.
La fonction devient donc :
function test_montage_partition()
{
# $1 = type de fs
# $2 = partition à monter
# $3 = point de montage
if ! grep -q "^$2 $3 $1" /etc/mtab ; then
sudo mount -t "$1" "$2" "$3" || exit 1;
return 0
else
echo "Info : La partition est déjà montée."
return 1
fi
}
Note : le return 0 n’est vraiment pas obligatoire car comme pour un script sans exit, s’il n’y a pas eu de return à la sortie d’une fonction, son statut est celui de la dernière instruction. Or dans le cas présent, la dernière instruction est le mount. Et si il s’est bien réalisé, il a pour statut 0, donc la fonction aura également 0 pour statut.
Ensuite, il s’agit effectivement d’intégrer cette fonction au script :
deja_montee=0
read -p 'sauve ou sauve2 ? : ' part
case $part in
sauve)
test_montage_partition "$systeme_fich" "$ddext" "$mount_rep" || deja_montee=1
;;
sauve2)
test_montage_partition "$systeme_fich2" "$ddext2" "$mount_rep" || deja_montee=1
;;
*)
echo "mauvaise entrée" >&2; exit 1;
;;
esac
je te laisse intégrer cette nouvelle variable “deja_montee” au moment du démontage de la partition
note : je te préviens : j’ai en tête depuis un moment l’intégration de 2 nouvelles notions qui vont radicalement changer ton script afin d’en simplifier quelques éléments. Mais pour le moment, je préfère te laisser continuer ainsi pour ne pas brusquer les choses.
bon, je vais vérifier si ma pâte à pain est suffisamment levée ^^
Après le clavier, tu vas au fournil
Bon, je n’ai relu que trois fois et j’ai emmagasiné. Tu peux donc te considérer comme un bon pédagogue
Je n’avais donc pas faux quand je pensais à sortir avec 0 mais ce que je ne savais pas, c’est le ‘retun’ (comme en Pascal si mes souvenirs sont bon, ou en C ???).
Là, je pense que c’est le ‘-q’ qui permet de sortir 0, sinon, ça devrait être 1, non ?
if ! grep -q "^$2 $3 $1" /etc/mtab ; then
Bon, ben je reprends les hostilité ce soir très tard et ensuite, demain, la journée est prise car le fils aîné revient en France, après un périple d’expat de 6 ans en Asie. Il veint donc nous dire un petit bonjour.
Alors ptet un rapide passage demain mais pas sûr.
@ bientôt.