Chrisi: PERL mehrere Befehle auf der Shell absetzen

Hallo zusammen,

ich bin mit Perl am bauen und möchte gern mehrere Befehle an die Shell senden, aber das aktuelle Script nicht abrechen oder anhalten.

system("/usr/bin/firefox --display :1 > /dev/null");
sleep(100);
... weitere Befehle ...
kill("KILL","firefox-bin");

Das Problem hier ist das Firefox zwar aufgeht, das Script aber solange stehen bleibt bis ich Firefox wieder abschiesse.

Zudem würde ich gern nach dem öffnen des Browsers noch 2 weitere Befehle an die Shell senden.

Wie kann ich verhindern das system wartet bis der ausgerufene Prozess beendet wurde?

Danke für eure Hilfe!
Chrisi

  1. ich bin mit Perl am bauen und möchte gern mehrere Befehle an die Shell senden, aber das aktuelle Script nicht abrechen oder anhalten.

    system("/usr/bin/firefox --display :1 > /dev/null");

    du kennst perldoc?
    Die komplette Perl Doku auf deiner Festplatte (aber auch im Internet z.b. http://perldoc.perl.org/)

    http://perldoc.perl.org/functions/system.html

    Does exactly the same thing as exec LIST , except that a fork is done first, and the parent process waits for the child process to complete.

    ....

    sollte helfen...

    Struppi.

    --
    Javascript ist toll (Perl auch!)
  2. hallo,

    ich bin mit Perl am bauen und möchte gern mehrere Befehle an die Shell senden, aber das aktuelle Script nicht abrechen oder anhalten.

    Perl kann, genauso wie die Shell selbst (übrigens: welche?) mit Pipes umgehen, vielleicht ist das eine Richtung, in der du überlegen könntest.

    system("/usr/bin/firefox --display :1 > /dev/null");

    Ich verstehe nicht, was du hier (und warum überhaupt) nach /dev/null schicken willst. Und: ist das ein CGI-Programm oder eines für die Konsole?

    sleep(100);
    ... weitere Befehle ...
    kill("KILL","firefox-bin");
    Das Problem hier ist das Firefox zwar aufgeht, das Script aber solange stehen bleibt bis ich Firefox wieder abschiesse.

    Du legst dein Script schließlich schlafen - ohne ihm ein Gutenachtlied vorgesungen zu haben, tststs. Und warum du deinen Firefox zuletzt killen willst, ist auch ein bißchen - naja, schwer verständlich. Aber insgesamt wird man wohl erst verstehen können, was du wirklich tun willst, wenn du die "weiteren Befehle" auch angibst, so daß dein Konzept etwas durchsichtiger wird.

    Zudem würde ich gern nach dem öffnen des Browsers noch 2 weitere Befehle an die Shell senden.

    Mit aller Vorsicht und etwas Rätselraterei: das könnte man möglicherweise so lösen, daß es gleich ein Shellscript ist, das du ausführst, und das lediglich irgendwann auch eine Perl-Akion initialisiert.

    Wie kann ich verhindern das system wartet bis der ausgerufene Prozess beendet wurde?

    http://perldoc.perl.org/functions/system.html

    Grüße aus Berlin

    Christoph S.

    --
    Visitenkarte
    ss:| zu:) ls:& fo:) va:) sh:| rl:|
    1. Hi,

      system("/usr/bin/firefox --display :1 > /dev/null");

      Ich verstehe nicht, was du hier (und warum überhaupt) nach /dev/null schicken willst. Und: ist das ein CGI-Programm oder eines für die Konsole?

      Das Perlscript soll auf der Konsole laufen und die Aufrufe mit System() sollen an /bin/bash gehen.

      Aber insgesamt wird man wohl erst verstehen können, was du wirklich tun willst, wenn du die "weiteren Befehle" auch angibst, so daß dein Konzept etwas durchsichtiger wird.

      system("export DISPLAY=':1'");

      system("/usr/bin/firefox --display :1 http://www.example.com/ > /dev/null");

      sleep(10);

      system("/usr/bin/import -window root -display :1 test.jpg");

      kill("KILL","firefox-bin");

      Ich rufe hier den Browser auf und schiesse ein Abbild von der Webseite und speichere dieses dann als JPG.

      Als Shellscript habe ich das ganze schon am laufen, nur möchte ich das ganze gern mit Perl machen weil ich eine Datenbank abfragen muss und dies hier mit DBI mache.

      Kannst du mir da einen Tipp geben wie ich das am besten hinbekommen kann?

      Danke und Gruß
      Chrisi

      1. Ich grüsse den Cosmos,

        Als Shellscript habe ich das ganze schon am laufen, n

        Wieso erfindest du das Rad zweimal? Du brauchst doch nur das Shellscript per PERL anzustossen und dann die Datenbankzugriffe abarbeiten.

        Möge das "Self" mit euch sein

        --
        Neulich dachte ich mir, einmal S/M ausprobieren wäre eine tolle Erfahrung. Also hab ich Windows gebootet ...
      2. hallo,

        Das Perlscript soll auf der Konsole laufen und die Aufrufe mit System() sollen an /bin/bash gehen.

        Das steht aber nicht da. Das einzige, was dasteht, ist ein >/dev/null, und das gilt für deinen Firefox.

        system("export DISPLAY=':1'");

        system("/usr/bin/firefox --display :1 http://www.example.com/ > /dev/null");

        sleep(10);

        system("/usr/bin/import -window root -display :1 test.jpg");

        kill("KILL","firefox-bin");

        Ich rufe hier den Browser auf und schiesse ein Abbild von der Webseite und speichere dieses dann als JPG.

        Zumindest mit den vorgestellten Scriptzeilen tust du das nicht, so weit ich das beurteilen kann.

        Als Shellscript habe ich das ganze schon am laufen

        Ah, das ist doch gut.

        nur möchte ich das ganze gern mit Perl machen weil ich eine Datenbank abfragen muss und dies hier mit DBI mache.

        Du kannst deinen Schnappschuß auch von der Shell aus in eine Datenbank schreiben lassen - die später Programmen, die diese Datenbank über CGI auslesen/nutzen wollen, ebenfalls zur Verfügung steht. Ich sehe nur nicht, daß dir

        system("/usr/bin/import -window root -display :1 test.jpg");

        überhaupt einen Schnappschuß liefern würde.

        Kannst du mir da einen Tipp geben wie ich das am besten hinbekommen kann?

        Naja ... so aus dem Handgelenk nicht, weil ich noch nicht ganz kapiert habe, welche Technologie (Shellscript oder Perl) tatsächlich nötig ist. Und auch deine Aufgabenstellung nur umrißhaft verstehe. Es reicht vorerst nur soweit, dir nochmal den Gebrauch von Pipes zu empfehlen, den Rest müßte ich mir etwas gründlicher durch den Kopf gehen lassen, sorry.

        Grüße aus Berlin

        Christoph S.

        --
        Visitenkarte
        ss:| zu:) ls:& fo:) va:) sh:| rl:|
  3. Moin.

    Das Problem hier ist das Firefox zwar aufgeht, das Script aber solange stehen bleibt bis ich Firefox wieder abschiesse.

    Warum das so ist, hat Struppi schon geschrieben. Du könntest das Problem auf 2 Wegen lösen: Benutze Threads oder Prozesse (fork). Dazu hier ein Beispiel. Es wird ein Child erzeugt, Parent und Child warten eine zufällige Zeit, wer zuerst fertig ist, killt den anderen.

    #!/usr/bin/perl -w
    use strict;

    eigene ID merken

    my $ParentId = $$;
    my $timeout_parent = int(rand(9) + 1);
    my $timeout_child = int(rand(9) + 1);

    Prozess für Timer erzeugen

    my $ChildId = fork();
    die "fork: $!" unless defined $ChildId;

    if ($ChildId) {
        # Elternprozess
        print "Elternprozess gestartet, Laufzeit $timeout_parent Sekunden \n";
        sleep ($timeout_parent);
        print "Timeout, Kindprozess killen!\n";
        # KindProzess killen
        kill("KILL",$ChildId);
    }else{
        # Kindprozess
        print "Kindprozess gestartet, Laufzeit $timeout_child Sekunden \n";
        sleep ($timeout_child);
        print "Timeout, Elternprozess killen!\n";
        # Elternprozess killen
        kill("KILL",$ParentId);
    }
    exit;

    Im Elternprozess startest Du den Firefox, im Kindprozess wartest Du, machst Dein Screenshot, killst den Elternprozess und beendest dich. Da Firefox ein Kind vom Elternprozess ist, wird er beim Killen des Prozesses mit entsorgt.

    Gruß Frank

    1. Hey,
      viel einfacher geht es, wenn man die Shell forken lässt.

        
      system 'firefox &';  
      
      
      --
      水-金-地-火-木-土-天-海-冥