diff -r 4a1820d504c4 -r 02ef2d1b190a bin/imager.save --- a/bin/imager.save Fri Jul 29 11:09:36 2011 +0200 +++ b/bin/imager.save Fri Jul 29 14:52:05 2011 +0200 @@ -15,6 +15,7 @@ use Getopt::Long; use Pod::Usage; + use constant KiB => 1024; use constant MiB => 1024 * KiB; use constant GiB => 1024 * MiB; @@ -23,25 +24,20 @@ sub get_devsize; sub get_devname; +sub save; $SIG{INT} = sub { die "Got INT\n" }; my %o = ( compress => undef, verbose => undef, - blocksize => 2 * MiB, + blocksize => 4 * MiB, ); lock_keys(%o); my $NOW = time(); MAIN: { - my ($src, $dst); - - my $idx = "{DIR}/idx/{HOSTNAME}/{DEVICE}/"; - my $data = "{DIR}/data"; - my $size; - GetOptions( "h|help" => sub { pod2usage(-verbose => 1, exit => 0) }, "m|man" => sub { @@ -64,9 +60,29 @@ } }, ) - and @ARGV == 2 - or pod2usage; - ($src, $dst) = @ARGV; + and @ARGV >= 2 or pod2usage; + + my $dst = pop @ARGV; + foreach my $src (@ARGV) { + if (my $pid = fork()) { + next; + } + elsif (not defined $pid) { + die "Can't fork: $!\n" + } + save($src, $dst); + exit; + } + + do 1 while wait != -1; + +} + +sub save { + my ($src, $dst) = @_; + my $idx = "{DIR}/idx/{HOSTNAME}/{DEVICE}/"; + my $data = "{DIR}/data"; + my $size; foreach ($idx, $data) { s/{DIR}/$dst/g; @@ -105,7 +121,8 @@ local $SIG{ALRM} = sub { my $speed = ($stats{written} + $stats{skipped}) / (time - $^T + 1); say sprintf -"# done %5.1f%% | %24s (%*d of $stats{todo}, written %*d, skipped %*d)", +"# %*s done %5.1f%% | %24s (%*d of $stats{todo}, written %*d, skipped %*d)", + (sort {$a<=>$b} map { length basename $_ } @ARGV)[-1] => basename($src), 100 * (($stats{written} + $stats{skipped}) / $stats{todo}), ($speed ? (scalar localtime($^T + $stats{todo} / $speed)) : ""), length($stats{todo}) => $stats{written} + $stats{skipped}, @@ -157,9 +174,9 @@ say {$index} "# DONE (runtime " . (time() - $^T) . "s)"; - say "# DONE (runtime " . (time() - $^T) . "s)"; - say "# WRITTEN $stats{written}, SKIPPED $stats{skipped} blocks"; - say "# SAVINGS " + say "# $src DONE (runtime " . (time() - $^T) . "s)"; + say "# $src WRITTEN $stats{written}, SKIPPED $stats{skipped} blocks"; + say "# $src SAVINGS " . sprintf "%3d%%" => 100 * ($stats{skipped} / ($stats{written} + $stats{skipped})); @@ -215,7 +232,7 @@ =item B<-b> I|B<--blocksize>=I -The blocksize used. (may be suffixed with K, M, G). (default: 2MiB) +The blocksize used. (may be suffixed with K, M, G). (default: 4 MiB) =item B<-h>|B<--help>