[Cologne-pm] script auf mehreren CPU's starten

Cem Sakaryali cem.sakaryali at easi.de
Thu Nov 10 12:11:56 PST 2005


Hi Aristoteles,

Eine Anmerkung am Rande, kann man bei unserer Mailingliste
Reply To: cologne-pm at pm.org einstellen? 

Wenn ich einfach
reply mache geht es nur an den sender. Wenn man reply to all
macht bekommt der sender die Mail 2 mal.

Z.B wenn Mike mir antwortet bekomme ich die Mail 2 mal.


On Thu, 2005-11-10 at 19:30 +0100, A. Pagaltzis wrote:
> Hi Cem,
> 
> * Cem Sakaryali <cem.sakaryali at easi.de> [2005-11-10 11:55]:
> > Meine Frage ist, da die einzelne Dir's mitteinander nichts
> > zutun haben wuerde ich sie parallel auf mehreren maschienen
> > starten. Wie kann ich dies machen?
> 
> Auf mehreren Maschinen, oder auf mehreren CPUs? Oder… was? :-)

Eigentlich auf mehreren Maschinenen wobei jeder von denen 2 
CPUs hat. Also beides :) Also 2 Maschinen fuer 4 directorys.

Ich habe das Modul fork gefunden, ich denke dieses Modul
kann auf eine Maschiene 2 prozesse erzeugen. Leider gehört
fork nich zu standart perl und ich habe keine Ahnung ob
es sich auf meiner Maschiene installieren lässt. 

> 
> Ehrlich gesagt würde ich für diese Aufgabe garkein Perl
> schreiben, sondern einfach Shell verwenden und die
> Parallelausführung per üblicher Jobkontrolle erledigen. Diese
> Aufgaben sind schliesslich der ganze Lebenssinn der Shell.
> 
> Zum Skript ein Haufen Kommentare:
> 
> > my $DirectoryWhereToPut = '/backup';
> 
> Der englische Begriff dafür ist übrigens »destination«.
> 
> > my ($stund,$min,$sec,$tag,$monat,$jahr)=get_time ();
> > 
> > foreach my $Dir (keys %hash) {
> >     my $TarFileName =
> > "$Dir"."BACKUP"."_"."$jahr"."_"."$monat"."_"."$tag\.tar";
> >     CompressFile ($Dir,$TarFileName);
> >     MoveFile ($TarFileName,$DirectoryWhereToPut);
> > }
> 
> Das ist in vielerlei Hinsicht unschön.
> 
> Als allerallererstes: bitte Variablen nicht allein in
> Anführungszeicehn setzen. Perl ist keine Shell. (Ja, es gibt
> einen subtilen Unterschied – der zeigt sich zB. bei Referenzen,
> die mit Anführungszeichen nicht funktionieren.)
> 
> Der Backslash ist übrigens überflüssig.
> 
> Ausserdem baust du den immer gleichen String aus denselben
> drei von sechs Variablen zusammen – die anderen drei werden
> garnicht verwendet. Schöner ist es, weniger Code zu schreiben,
> indem du einfach die POSIX-Funktion `strftime` verwendest – sowas
> wie ein `printf` für Datums- und Zeitangaben.
> 
> Und ausserdem: ist es deine Absicht, dass zwischen $Dir und dem
> String »BACKUP« kein Verzeichnistrenner steht? Im Grossen und
> Ganzen ist es anzuraten, Pfade mit den Funktionen aus File::Spec
> zusammenzubauen, statt sie mit blossen String-Operationen
> zusammenzukleben.
> 
> > sub CompressFile {
> >     my ($Dir,$TarFileName) =@_;
> >     # gzip it
> >     system ("gzip -rf $Dir/\*");
> >     print "gzip $Dir done\n";
> >     # tar it
> >     system ("tar cvf $TarFileName $Dir/\*");
> >     print "tar $TarFileName done\n";
> >     return;
> > }
> 
> Warum gzippst du die Dateien alle einzeln und packst sie dann in
> einen unkomprimierten Tarball? Wäre es andersrum nicht viel
> sinnvoller?
> 

Dies ist historisch entstanden, ich hatte wenig Platz auf
der Platte und tar danach gz hat die Platte voll gemacht.   

Deine Vorschläge werde ich mir morgen bei der Arbeit
anschauen.

Vielen Dank
Cem
 

> > sub MoveFile {
> >     my ($TarFileName,$DirectoryWhereToPut) =@_;
> >     # move it to DirectoryWhereToPut
> >     system ("mv $TarFileName $DirectoryWhereToPut");
> >     print "move $TarFileName to $DirectoryWhereToPut done\n";
> >     return;
> > }
> 
> `system( $langer_string )` ist unschön. Enthalten deine
> Dateinamen zufällig mal Leerzeichen oder andere Metazeichen, hast
> du ein Problem. Eindeutig und sicher ist
> `system( $programm, @parameter )`.
> 
> > sub get_time {
> >     my ($sec,$min,$stund,$tag,$monat,$jahr,$junk,$day_of_year)=localtime();
> >     $tag=  sprintf "%2.2d",$tag;
> >     $monat=sprintf "%2.2d",$monat+1;
> >     return ($stund,$min,$sec,$tag,$monat,($jahr+1900));
> > }
> 
> Anmerkung am Rande: du kannst auch einfach `%2d` schreiben – ich
> glaube nicht, dass du tatsächlich an Nachkommastellen
> interessiert bist…
> 
> Summa summarum würde ich dieses Skript so oder ähnlich schreiben:
> 
>     #!/usr/bin/perl
>     use strict;
>     use warnings;
> 
>     use Getopt::Long;
>     use POSIX qw( strftime );
> 
>     GetOptions(
>         'destdir|d=s' => \( my $opt_destination = '/backup' ),
>         'srcdir|s=s'  => \( my %opt_srcdir ),
>     );
> 
>     if( not %opt_srcdir ) {
>         %opt_srcdir = (
>             # directory name    directory where to put
>             a  => 'cem/a'  ,
>             b  => 'cem/b'  ,
>             c  => 'cem/c'  ,
>             d  => 'cem/d'  ,
>         );
>     }
> 
>     my $ymd = strftime '%Y_%m_%d', localtime;
> 
>     foreach my $dir ( keys %opt_srcdir ) {
>         my $tarball = "${dir}BACKUP_${ymd}.tar.gz";
>         run_cmd( tar => 'cvzf', $tarball, $dir );
>         run_cmd( mv => $tarball, $opt_destination );
>     }
> 
>     sub run_cmd {
>         system { $_[ 0 ] } @_;
>         print "Done: @_\n";
>     }
> 
> (Code ohne Gewähr.)
> 
> Das ist etwas hakelig, weil dein Mapping-Hash noch nicht richtig
> verwendet wird… aber naja, es ist halt zu erkennen, wie es
> aussehen sollte.
> 
> Um es richtig rund zu machen fehlen da jetzt noch etwas POD und
> ein paar Aufrufe von Pod::Usage.
> 
> Gruss,
> -- 
> #Aristoteles
> *AUTOLOAD=*_=sub{s/(.*)::(.*)/print$2,(",$\/"," ")[defined wantarray]/e;$1};
> &Just->another->Perl->hacker;
> _______________________________________________
> Cologne-pm mailing list
> Cologne-pm at pm.org
> http://mail.pm.org/mailman/listinfo/cologne-pm



More information about the Cologne-pm mailing list