Re: [OT] Perl: Subshell

2005-03-22 Diskussionsfäden Ingo Blechschmidt
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

2005-03-22 Diskussionsfäden Moritz Karbach
[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

2005-02-25 Diskussionsfäden Ingo Blechschmidt
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

2005-02-24 Diskussionsfäden Moritz Karbach
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

2005-02-23 Diskussionsfäden Fred Kastl
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

2005-02-23 Diskussionsfäden Heiko Schlittermann
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