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

Cem Sakaryali cem.sakaryali at easi.de
Thu Nov 10 13:05:40 PST 2005


http://search.cpan.org/~aristotle/Proc-Fork-0.11/lib/Proc/Fork.pm

Proc::Fork Ist ja sogar von Dir :)


On Thu, 2005-11-10 at 21:11 +0100, Cem Sakaryali wrote:
> 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
> 
> _______________________________________________
> 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