PERL mehrere Befehle auf der Shell absetzen
Chrisi
- perl
1 Struppi0 Christoph Schnauß0 Chrisi
1 agapanthus0 迪拉斯
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
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.
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.
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.
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
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
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.
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;
my $ParentId = $$;
my $timeout_parent = int(rand(9) + 1);
my $timeout_child = int(rand(9) + 1);
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
Hey,
viel einfacher geht es, wenn man die Shell forken lässt.
system 'firefox &';