Re: [OT] Perl: Subshell
Hi, Moritz Karbach wrote: > Das externe Kommando, das ich ausfÃhren will, ist > "executable < steering.txt > logfile.txt" > > Ich forke, und rufe das Kommando im Child mit exec auf. Da aber > Shell-Metazeichen im Kommando sind, ruft Perl erstmal "sh -c" auf, und > dieser Prozess bekommt dann die Child process id. Ich stehe also > wieder ohne die id von meinem "eigentlichen" externen Prozess da :-/ ah, klar. Die LÃsung ist simpel, in deinem Child tust du einfach schon STDIN und STDOUT umbiegen. Wenn du dann "executable" exec()st, Ãbernimmt es die File-Deskriptoren des Vaters (also dein umgebogenes STDIN und STDOUT), und perl muss keine Shell mehr starten, um Metazeichen zu interpretieren. Das sieht dann z.B. so aus: # Wenn wir das Kind sind... if(fork == 0) { # Zuerst die spÃteren neuen STDINs und STDOUTs Ãffnen. open my $infh, "<", "steering.txt" or die "Couldn't open Âsteering.txt for reading: $!\n"; open my $outfh, ">", "logfile.txt" or die "Couldn't open Âlogfile.txt for writing: $!\n"; # Und jetzt STDIN/STDOUT umbiegen: open STDIN, ">&", $infh or die "Couldn't replace STDIN: $!\n"; open STDOUT, ">&", $outfh or die "Couldn't replace STDOUT: $!\n"; # Und jetzt schlieÃlich den eigentlichen Prozess aufrufen: exec "executable" or die "Couldn't exec ÂexecutableÂ: $!\n"; } > PS: Ich bin auch dankbar fÃr eine angesagte Perl Mailinglist, ich weià > dass es ja hier eingentlich OT ist. comp.lang.perl.*, de.comp.lang.perl.*, http://perlmonks.org/, #perl auf Freenode --Ingo -- Linux, the choice of a GNU | Running Windows on a Pentium is like having generation on a dual AMD | a brand new Porsche but only be able to Athlon!| drive backwards with the handbrake on. -- Haeufig gestellte Fragen und Antworten (FAQ): http://www.de.debian.org/debian-user-german-FAQ/ Zum AUSTRAGEN schicken Sie eine Mail an [EMAIL PROTECTED] mit dem Subject "unsubscribe". Probleme? Mail an [EMAIL PROTECTED] (engl)
Re: [OT] Perl: Subshell
[posted and mailed] Hi Ingo, ist schon ein bisschen her, deswegen auch nochmal per eMail. > bist du dir sicher, dass du das externe Program auch mit exec() > gestartet hast? Denn: exec() *ersetzt* das aktuelle Programm (also > das Kind) durch dein externes Programm. Wenn du nun die PID deines > Childs abschieÃt, schieÃt du damit das externe Programm ab, da es > ja die PID des Childs Ãbernommen hat. Das Child, was du geforkt > hast, also einen Teil deines Perl-Programms, gibt es dann nicht mehr. Ja, ich benutze exec(). Und jetzt habe ich mich ein wenig mehr in die Materie eingearbeitet, diese fork-Geschichte war komplett neu fÃr mich. Nun das Problem: Das externe Kommando, das ich ausfÃhren will, ist "executable < steering.txt > logfile.txt" Ich forke, und rufe das Kommando im Child mit exec auf. Da aber Shell-Metazeichen im Kommando sind, ruft Perl erstmal "sh -c" auf, und dieser Prozess bekommt dann die Child process id. Ich stehe also wieder ohne die id von meinem "eigentlichen" externen Prozess da :-/ Hast du noch VorschlÃge? - Moritz PS: Ich bin auch dankbar fÃr eine angesagte Perl Mailinglist, ich weià dass es ja hier eingentlich OT ist.
Re: [OT] Perl: Subshell
Hi, Moritz Karbach karba.ch> writes: > Wenn ich das child kille, indem ich vom parent aus `kill $pid` > mache, lÃuft das externe binary weiter, nur das child stirbt. > Daran Ãndert sich auch nichts, wenn ich nach exec "binary" ein > "wait" einfÃge oder wenn ich statt exec system oder backticks > benutze... bist du dir sicher, dass du das externe Program auch mit exec() gestartet hast? Denn: exec() *ersetzt* das aktuelle Programm (also das Kind) durch dein externes Programm. Wenn du nun die PID deines Childs abschieÃt, schieÃt du damit das externe Programm ab, da es ja die PID des Childs Ãbernommen hat. Das Child, was du geforkt hast, also einen Teil deines Perl-Programms, gibt es dann nicht mehr. Anders ist das bei system() und Backticks: Dort lÃuft das Child weiter, und das externe Programm ist ein eigener Prozess. Wenn du dort dann die Kind-PID killst, lebt das externe Programm in der Tat weiter. -- Ingo -- Linux, the choice of a GNU | Failure is not an option. It comes bundled generation on a dual AMD- | with your Microsoft product. Athlon!| -- Haeufig gestellte Fragen und Antworten (FAQ): http://www.de.debian.org/debian-user-german-FAQ/ Zum AUSTRAGEN schicken Sie eine Mail an [EMAIL PROTECTED] mit dem Subject "unsubscribe". Probleme? Mail an [EMAIL PROTECTED] (engl)
Re: [OT] Perl: Subshell
Hi Heiko, ich habe jetzt ein wenig mir fork herumgespielt aber ich fürchte, dass es nicht das ist was ich brauche. Denn: Wenn ich das child kille, indem ich vom parent aus `kill $pid` mache, läuft das externe binary weiter, nur das child stirbt. Daran ändert sich auch nichts, wenn ich nach exec "binary" ein "wait" einfüge oder wenn ich statt exec system oder backticks benutze... Threads kann ich nicht benutzen, weil sie nicht zu "Standard-Perl" gehören, und ich deswegen nicht davon ausgehen kann, dass es auf allen Rechnern verfügbar ist, wo das ganze laufen soll. Glaube ich jedenfalls. Cheers, - Moritz
Re: [OT] Perl: Subshell
Moritz Karbach wrote: Hi Liste, ich habe noch mal eine kleine Perl-Frage: Ich muss aus einem Perl-Skript einen externen Prozess starten, diesen beobachten und gegebenenfalls wieder abschießen. Dazu brauche ich die process id dieses Prozesses. Wie bekomme ich die möglichst einfach? In Shell-Skript geht das so: #!/bin/bash ./externes_binary & PROCESSID=$! Bisher mache ich sowas: #!/usr/bin/perl `./externes_binary &`; ...und parse dann den output von ps -a, was leider nicht sehr zuverlässig ist (muss auf vielen verschiedenen systemen laufen). Ein anschließendes $processid = `echo $!`; klappte leider nicht. Dankbar für Anregungen, - Moritz Oder du machst gleich mit Threads z.B. http://migo.sixbit.org/papers/Perl_Threads/ gruß Fred -- Haeufig gestellte Fragen und Antworten (FAQ): http://www.de.debian.org/debian-user-german-FAQ/ Zum AUSTRAGEN schicken Sie eine Mail an [EMAIL PROTECTED] mit dem Subject "unsubscribe". Probleme? Mail an [EMAIL PROTECTED] (engl)
Re: [OT] Perl: Subshell
Moritz Karbach <[EMAIL PROTECTED]> (Mi 23 Feb 2005 18:00:06 GMT): > Ich muss aus einem Perl-Skript einen externen Prozess starten, diesen > beobachten und gegebenenfalls wieder abschießen. Dazu brauche ich die process > id dieses Prozesses. Wie bekomme ich die möglichst einfach? > In Shell-Skript geht das so: Wenn Du wirklich nur den Subprozess haben willst, dann my $pid = fork(); die "Can't fork: $!\n" if not defined $pid; if ($pid == 0) { # ich bin das kind... exec "externes_binary"; } # Und ich bin der Vater und kann mich um das Kind $pid # kümmern Best regards from Dresden Viele Gruesse aus Dresden Heiko Schlittermann -- SCHLITTERMANN.de internet & unix support - Heiko Schlittermann HS12-RIPE - gnupg encrypted messages are welcome - key ID: 48D0359B --- gnupg fingerprint: 3061 CFBF 2D88 F034 E8D2 7E92 EE4E AC98 48D0 359B - signature.asc Description: Digital signature