Comment tester la présence valide d'une partition

J’ai décidé de faire un script bash pour automatiser mes MAJs hebdomadaires.
Je veux essayer de le faire seul, pour apprendre et je ne tiens pas à ce que vous m’aidiez plus que ce que je demande.
Ma première question :

Mes sauvegardes sont faites sur un DDext dans la partition ‘sdb9’.
Ce DDext n’est pas allumé en permanence (auto-alimenté).
Il m’arrive d’essayer de le monter sans l’avoir allumé au préalable et, bien sûr, il n’obéit pas.
Je voudrais donc commencer mon script par ce test de reconnaissance.
Problème ! je ne sais pas comment coder cette condition : si sdb9 est opérationnel
S’il s’agissait de tester l’existence d’un fichier, je saurais mais une partition ?
Je sais que tout est ‘fichier’ sous linux mais je ne pense pas que /dev/sdb9 suffise ?

[code]ddext=/dev/sdb9

if [ -e $ddext ]
then
echo “OK”
else
echo "Le DDext ne répond pas"
fi[/code]

EDIT :
J’en reviens pas : ça fonctionne :030

Ça me permet de poser une autre question :
Je n’ai pas besoin de réponse quand c’est OK, quoi entrer à la place, ligne 5 ?

Je pense en pseudo code :
si ta condition n’est pas vraie, affiche le message d’erreur, et pas de else…

Ben oui, je viens d’y penser en mangeant.
Je vais même tourner la condition en négatif et ça devrait aller
‘essai’ et je reviens en EDIT

EDIT : :023 et c’est franchement plus simple

[code]ddext=/dev/sdb9

if [ ! -e $ddext ]
then
echo “Le DDext ne répond pas”
fi[/code]

EDIT 2 :
J’ai relu ta proposition LAV-FRED et en fait, je crois que c’est ce que tu écrivais ?

Oui c’est bien ce que j’écrivais (peut être mal formulé mais c’est ça) :smiley:

Encore une question et je vous propose mon travail pour correction :
Deux commandes qui doivent être exécutées l’une après l’autre.
La première prends un certain temps (sauvegarde rsync de /)
Puis-je écrire mes deux commandes à la suite l’une de l’autre sur deux lignes différentes (elles sont longues et c’est pour plus de clarté) ?
La seconde sera automatiquement exécutée lorsque l’exécution de la première sera terminée ?

Les commandes d’un script bash écrites à la suites les unes des autres ou avec un retour à la ligne sont exécutées dès que la commande précédente se termine, peu importe le temps d’exécution de celle-ci.
Si tu veux que ton script continu sans attendre la fin d’une commande tu dois placer un et commercial “&” à la fin de celle-ci (comme ds le terminal en fait),
tu peux carrément la détacher de tout processus parent en mettant nohup devant (ce qui te permet de te délogguer et ta commande continue de tourner.

Voilà voilà…

bonsoir,

l’inconvénient de nohup, c’est que toute sortie standard est redirigée vers le fichier “nohup.out” du dossier courant. on peut donc se retrouver avec des fichiers polluants rapidement le dd.

pour contourner ce léger problème, il y a la builtin “disown” qui fait le même taf.

exemple dans un script :

commande_qui_doit_être_indépendante &
disown %+

précision : %+ permet de référencer le dernier process mis en backgroup. cf ici.

exemple en console (ça fonctionne en ssh mais il est conseillé d’utiliser screen car cela permet de récupérer le job après une déconnexion) :

commande_qui_doit_être_indépendante &
disown -h %+

l’option -h permet de conserver le job dans la liste des jobs (mais ce n’est pas obligé, c’est une habitude que j’ai).

si le & n’a pas été utilisé - ou a été oublié - il faut utiliser la séquence CTRL+z pour stopper le process puis d’utiliser la builtin “bg” pour mettre en background (son pendant est “fg” pour foreground)

une autre builtin intéressante est wait. bien pratique lors de traitements asynchrones.

mais tout cela est décris sur la page que j’ai donné en lien.

Merci des explications.
une petite dernière :
je voudrais insérer deux lignes vides à la fin de mon script, pour bien faire ressortir un pense-bête.
1/ J’ai fait ce qui suit mais je suppose que ce n’est pas très élégant, y-a-t-il mieux que ces echo “” ?
2/ Éventuellement, peut-on augmenter la grosseur de la police ou/et la mettre en couleur ?

echo "" echo "" MA LIGNE D'ALERTE (PENSE-BETE) echo "" echo "" exit # fin du script

pour le echo “” regarde ici

pour les couleurs, tu peux utiliser les séquences d’échapement mais également l’instruction tput avec la commande setaf.

à toi d’utiliser ce qu’il te convient de mieux :

  • si tu dois changer au sein d’un même “echo”, il est préférable d’utiliser les séquences

Impec, autant pour les lignes vides que pour les caractères en couleur. Super ce second lien :023
:006

Une commande pour vider complètement la corbeille ?

rm -r "~/.local/share/Trash/" ?

Ben oui, ça je comprends mais le problème (j’ai ouvert un fil dans SD) c’est qu’il y a un wagon de fichiers dans ce dossier et j’ai peur qu’ils ne soient pas tous à virer ?
Fais l’expérience d’aller voir dans ce dossier Trash.
Je vais faire un essai en les sauvegardant auparavant .
Je donnerai la réponse ensuite.

[quote=“Totor”] d’échapement mais également l’instruction tput avec la commande setaf.
[/quote]

Et d’où viens ce setaf, que je n’ai trouvé ni dans “man tput” ni avec “man bash”, ni avec “apt-cache search setaf”, ni avec set+, et sans autre explication ni avec avec golito ni avec les liens cités ?


Exemple ( sans setup ): script d’affichage du tableau des couleurs avec leur code d’échappement:

[code]clear
echo $0
echo " exemple: PS1=’\033[47;34m … \033[0m’ => prompt … bleu sur fond gris"
esc="\033[“
echo -n " 40 41 42 43"
echo " 44 45 46 47 “
for fore in 30 31 32 33 34 35 36 37; do
line1=”$fore m “
line2=”$fore ;1m “
for back in 40 41 42 43 44 45 46 47; do
line1=”${line1}${esc}${back};${fore}m Normal ${esc}0m"
line2=”${line2}${esc}${back};${fore};1m Bold ${esc}0m"
done
echo “$line1” ; echo “$line2”;
done
echo "code esc: ‘‘033’[’ réinitialiser: esc0m "
echo " Les codes couleur doivent être encadrés par [ et ] "
echo[
/code]


Je reviens aussi sur la question des fins de ligne posée au début de ce fil, même si la suite a été intéressante.
Je crois que Ricardo demandait l’effet d’une fin de ligne en bash

La fin de ligne est la fin d’une commande, équivalente au ; (point-virgule).

En bash, pour écrire une seule commande sur plusieurs lignes, comme rsync avec des options et des longs noms de fichier, il faut échapper la fin de ligne avec un ‘[b][/b]’ (et surtout rien, aucun blanc derrière le ‘[b][/b]’ )
Une ligne de commande (ou de script ) peut être très longue ( au moins 511 caractères je crois, sans doute plus ). L’utilité du fractionnement d’une commande est donc uniquement sa lisibilité, ce qui n’est pas rien !

C’est une des différences avec Perl, pour qui le retour à la ligne ne signifie rien, et le point-virgule est obligatoire entre chaque commande ( sauf fin de bloc ou de programme ).

[quote=“ricardo”]Ben oui, ça je comprends mais le problème (j’ai ouvert un fil dans SD) c’est qu’il y a un wagon de fichiers dans ce dossier et j’ai peur qu’ils ne soient pas tous à virer ?
Fais l’expérience d’aller voir dans ce dossier Trash.
Je vais faire un essai en les sauvegardant auparavant .
Je donnerai la réponse ensuite.[/quote]

Crée plutôt un utilisateur de test, et fait un test sous cet utilisateur, après avoir créé et viré plusieurs fois des fichiers, des répertoires. Sans être un garantie absolue, ça te montrera peut-être quelque-chose ?

En fait, les gros dossiers plein de sous-dossiers, pleins eux-mêmes, sont des “expunged” donc : “effacés”.
Je vais tester ça bientôt.
Merci pour le complément d’info au sujet des lignes longues.

Je reviens aussi sur la 1ère question:
pour tester si un répertoire est monté: mount

Par exemple, extrait correspondant du script sur lequel j’ai ramé avant toi:

[code]## DESTINATION:
VOL_DESTINATION=’/home/BKP’

VOL_DESTINATION est-il déjà monté ?

MONTE=$( mount | egrep $VOL_DESTINATION );
[/code]

Ici on suppose que /home/BKP est dans /etc/fstab

Tu peux aussi faire egrep “/dev/volume” au lieu de egrep '/point/de/montage’
Si tu mets les 2 versions de egrep en série, tu assures ( version paranoïaque, peut-être utile avec un cron )

$MONTE est vide = faux ou non-vide = vrai, ce qui fait un test très simple à écrire.

C’est en effet une autre solution mais celle que j’ai employée est valable par défaut, la ligne du dessus (qu’on ne voit pas ici) monte la partition.
les lignes de dessous n’envoient l’alerte que s’il y a un oubli de connexion, ce que je cherchais

[code]ddext=/dev/sdb9

if [ ! -e $ddext ]
then
echo "Le DDext ne répond pas"
fi[/code]

Bonsoir,

pourtant tout est indiqué dans le man de tput :

et lorsque l’on consulte le man de terminfo, section 5 :

Pour l’avoir consulté dans le cadre de cette demande, j’avoue que ce man est très indigeste !

[quote=“josephtux”]Je reviens aussi sur la 1ère question:
pour tester si un répertoire est monté: mount
[/quote]

Oui à 99,9% des cas :wink:
Je m’explique : mount (ainsi que le fichier /etc/mtab) retourne l’ensemble des filesystems montés à condition qu’ils n’aient pas été montés avec l’option -n (ce qui est extrêmement rare).

C’est pourquoi j’exploite df de la sorte :

#!/bin/bash
mountPoint="$1"
if { read; read infos ; } < <(df "${mountPoint}" 2>/dev/null) && [ "${infos}" != "${infos%${mountPoint%/}}" ]
then
  echo "${mountPoint} est monté"
else
  echo "${mountPoint} n'est pas monté"
fi

Je déterre un peu le sujet pour apporter un morceau de code un peu différent.
Plutôt que de checker /dev/sdxx ou le point de montage, je passe par l’uuid
Pourquoi ? amusez-vous à plugger un DD usb, le monter, le couper électriquement (cas d’une panne électrique), de le rallumer
il ne sera plus en /dev/sdc par exemple mais /dev/sdd
Chose qui me posait souci chez un client.
Avec l’uuid, ça passe bien mieux je trouve :slightly_smiling:

ça donne qlqch comme ça :

[code]
#remplacer par l’uuid correspondant au bon disque
DISK=“00000000-0000-0000-0000-000000000000”

MOUNTPOINT="/mnt"

if mount -U ${DISK} ${MOUNTPOINT} ; then
printf “$(date +%d-%m-%Y\ %Hh%M) - Montage du disque reussi.\n”

action

else
printf "$(date +%d-%m-%Y\ %Hh%M) - Echec de montage du disque.\n"
exit 0
fi[/code]
…et bien évidement on umount en fin de script

Si le disque est connecté et utilisable, alors on le monte dans MOUNTPOINT
Si cela échoue pour une quelconque raison que ce soit (partition invalide, disque non connecté, etc.), alors on arrête tout
Chez certains clients, j’ai même poussé le vice en rajoutant en cas d’échec l’écriture de la sortie d’un “ls -alh /dev/disk/by-uuid/” et d’un “blkid” dans un fichier log