Los sistemas de ficheros compartidos por red son muy útiles a mi me simplifican mucho la tarea de almacenar copias de seguridad en una máquina diferente. Basta con tener montada la partición y usarla como si fuese local.
Sin embargo, cuando hay problemas de red o cortes de luz puede ser necesario montar o remontar esas particiones y se puede tardar bastante tiempo en detectar si no se tiene cuidado. Una forma de atacar el problema es tener a mano un script en el cron. A continuación pego el que acabamos de poner en funcionamiento en el labo:
#!/usr/bin/perl -w | |
use strict; | |
use Getopt::Long; | |
# PUT YOUR MOUNTPOINTS HERE | |
# No trailing slashes | |
use constant MOUNT_POINTS => qw( | |
/mnt | |
); | |
sub parse_mount { | |
my $mounts = {}; | |
for (split /\n/, qx/mount/) { | |
next unless m/((?:\/\S*)+) on ((?:\/\S*)+) type \w+/; | |
my ($device, $mount_point) = ($1, $2); | |
$mount_point =~ s/\/*^//; | |
$mounts->{$mount_point} = $device; | |
} | |
return $mounts; | |
} | |
my $verbose; | |
GetOptions ("verbose" => \$verbose); | |
unless ($verbose) { | |
close STDOUT; | |
open STDOUT, "> /dev/null" or die "Can't open /dev/null"; | |
} | |
for my $mount_point (MOUNT_POINTS) { | |
print "Mount point '$mount_point'\n"; | |
unless (-d $mount_point) { | |
print "\tnot a directory\n"; | |
print "\tUmounting... "; | |
if (system("umount", $mount_point)) { | |
print "KO\n"; | |
print STDERR "Unable to umount $mount_point\n"; | |
next; | |
} else { | |
print "OK\n"; | |
} | |
} | |
my $mounts = parse_mount(); | |
if (defined $mounts->{$mount_point}) { | |
print "\t'$mount_point' OK\n"; | |
next; | |
} | |
print "\tMounting... "; | |
if (system("mount", $mount_point)) { | |
print "Error\n"; | |
print STDERR "Unable to mount $mount_point\n"; | |
} else { | |
print "OK\n"; | |
} | |
} |
Podéis probarlo con la opción --verbose para ver qué hace paso a paso y que puede resumirse en comprobar si el montaje esta ido o desmontado y actuar en consecuencia. No olvidéis sustituir los puntos de montaje al principio del script!
Muy bueno el script! Especialmente la regex para parsear paths me ha encantado :)
ResponderEliminarDos apuntes...
* ¿Qué hace $mount_point =~ s/\/*^//; ?
No acabo de ver qué hace.... igual se me escapa, pero creo que no machea contra nada.
* El getOptions podría escribirse como
GetOptions ("verbose" => \(my $verbose = undef));
Es un poco más obtusa la sintaxis, pero declaras e inicializas en la misma linea, siendo más inmediato el refactorizar (especialmente util si tienes un puñado de variables).
Un saludo!!
Gracias,
ResponderEliminarLa regex elimina las barras al final del path y la sintaxis "obtusa" que dices merece la pena a partir de un par de variables.