Schrift
Wiki:Tipp zum Debugging: use Data::Dumper; local $Data::Dumper::Useqq = 1; print Dumper \@var;
[thread]6311[/thread]

Programm ausführen und weitermachen

Leser: 3


<< |< 1 2 >| >> 19 Einträge, 2 Seiten
Gast Gast
 2004-06-04 23:59
#83010 #83010
Hallo,

bin ein absoluter Perl-Neuling...
Wenn ich das richtig verstanden hab beendet exec() das Script und system() wartet bis der zu startende Prozess wieder beendet ist.
Wie kann ich ein Programm ausführen und danach gleich in meinem Script weitermachen?
[E|B]
 2004-06-05 00:35
#83011 #83011
User since
2003-08-08
2561 Artikel
HausmeisterIn
[Homepage] [default_avatar]
Mit Backticks:

Quote
$test = `ls`;
Gruß, Erik!

s))91\&\/\^z->sub{}\(\@new\)=>69\&\/\^z->sub{}\(\@new\)=>124\&\/\^z->sub{}\(\@new\)=>);
$_.=qq~66\&\/\^z->sub{}\(\@new\)=>93~;for(@_=split(/\&\/\^z->sub{}\(\@new\)=>/)){print chr;}

It's not a bug, it's a feature! - [CGI-World.de]
Der Michel
 2004-06-05 01:08
#83012 #83012
User since
2004-06-05
6 Artikel
BenutzerIn
[default_avatar]
Ich arbeite unter WindowsXP...
kann das sein dass das da nicht funktioniert?

Code: (dl )
1
2
$test = `notepad.exe`;
print "das ist ja toll";


Hier erfolgt die Ausgabe erst nachdem notepad beendet wurde.
Strat
 2004-06-05 01:43
#83013 #83013
User since
2003-08-04
5246 Artikel
ModeratorIn
[Homepage] [default_avatar]
notepad ist ein schwieriges beispiel, weil es eine anwendung ohne konsole ist (wenn du das programm startest, wird das dos-fenster gleich wieder frei gegeben). Bei solchen Programmen kannst du eigentlich einfach nur mit CPAN:Win32::Process abwarten, bis es beendet wird...

nebenbei: exec beendet den aktuellen (perl-)prozess und ersetzt ihn durch ein anderes programm, das dann unter derselben Prozess-Id weiterlaeuft. Ich habe es unter Windows schon laenger nicht mehr ausprobiert, aber vermutlich gibt es damit unter Windows immer noch probleme, weshalb man es dort besser nicht verwenden sollte...

wenn du mehr ueber perl wissen willst, lies dir mal die "Einfuehrung in Perl" auf meiner HP -> Vorträge durch...\n\n

<!--EDIT|Strat|1086385639-->
perl -le "s::*erlco'unaty.'.dk':e,y;*kn:ai;penmic;;print"
http://www.fabiani.net/
Der Michel
 2004-06-05 14:01
#83014 #83014
User since
2004-06-05
6 Artikel
BenutzerIn
[default_avatar]
Selbst wenn ich etwas probiere wie z.B.

Code: (dl )
1
2
$i = `copy C:\\grosseDatei.dat C:\\grosseDatei.bak`;
print "hallo da hinten";


wird mit der Ausgabe gewartet bis der vorangegangene Befehle abgearbeitet ist. Gibt es unter Windows also keine Möglichkeit soetwas zu realisieren?

Hab mir Dein pdf schon runtergeladen, werde ich mir mal in einer ruhigen Stunde durchlesen.

Gruss,
Michel
renee
 2004-06-05 14:11
#83015 #83015
User since
2003-08-04
14371 Artikel
ModeratorIn
[Homepage] [default_avatar]
Strat hat Dir schon den richtigen Tipp gegeben. Da man unter Windows nicht forken kann, musst Du das Modul Win32::Process benutzen...

Das Modul findest Du auf CPAN (http://search.cpan.org)...

Hier die Beschreibung: http://search.cpan.org/~gsar/libwin32-0.191/Process/Process.pm\n\n

<!--EDIT|renee|1086430641-->
OTRS-Erweiterungen (http://feature-addons.de/)
Frankfurt Perlmongers (http://frankfurt.pm/)
--

Unterlagen OTRS-Workshop 2012: http://otrs.perl-services.de/workshop.html
Perl-Entwicklung: http://perl-services.de/
Der Michel
 2004-06-05 14:21
#83016 #83016
User since
2004-06-05
6 Artikel
BenutzerIn
[default_avatar]
Achso...
Quote
Bei solchen Programmen kannst du eigentlich einfach nur mit CPAN: Win32::Process abwarten, bis es beendet wird...


Das hörte sich für mich so an als macht das das gleiche wie system(...).
Dann werde ich mich mal mit Modulen rumschlagen und schauen ob es hinhaut. :-)
Auf jeden Fall erst einmal vielen Dank für die Tips.

Gruss,
Michel
Gast Gast
 2004-06-05 15:31
#83017 #83017
[quote=renee,05.06.2004, 12:11]Da man unter Windows nicht forken kann, musst Du das Modul Win32::Process benutzen...
[/quote]
Das ist nicht mehr zutreffend ...
bereits unter NT (Servicepack weiß ich nicht mehr) war fork() implementiert und win2k Server unterstützen fork() ab der ersten Version.
coax
 2004-06-05 21:39
#83018 #83018
User since
2003-08-11
457 Artikel
BenutzerIn
[default_avatar]
[quote=Guest,04.06.2004, 21:59]Wie kann ich ein Programm ausführen und danach gleich in meinem Script weitermachen?[/quote]
probier mal:
Code: (dl )
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
#!/usr/bin/perl
$|++;

print "Erzeuge Kind was 5 Sekunden schlaeft...\n";

my $pid = fork();    # erzeuge Kind

unless($pid) {       # Block wird nur im Kind abgearbeitet
  sleep 5;
  exit;
}

print "Kind erfolgreich gestartet [$pid]\n" if defined $pid;

print "... und weiter gehts!...\n";

Das Skript erzeugt durch Forking ein Kindprozess der dann 5 Sekunden lang schlaeft. Dein ElterProzess arbeitet nach der Erzeugung des Kindes alle seine Anweisungen weiter ab (wartet also keine 5 Sekunden bis der Kindprozess fertig ist).

Grusz Christian.
,,Das perlt aber heute wieder...'' -- Dittsche
Strat
 2004-06-05 23:13
#83019 #83019
User since
2003-08-04
5246 Artikel
ModeratorIn
[Homepage] [default_avatar]
ab perl5.6 gibt es zwar ein fork, das auch unter windows funktioniert, aber halt nicht wie das unix-fork, das einen neuen unabhaengigen prozess erzeugt, sondern einen neuen interpreterthread.
perl -le "s::*erlco'unaty.'.dk':e,y;*kn:ai;penmic;;print"
http://www.fabiani.net/
<< |< 1 2 >| >> 19 Einträge, 2 Seiten



View all threads created 2004-06-04 23:59.