Schrift
[thread]7092[/thread]

open generiert 2 prozesse



<< >> 8 Einträge, 1 Seite
subsys
 2005-06-30 17:55
#55865 #55865
User since
2005-03-08
27 Artikel
BenutzerIn
[default_avatar]
Hallo zusammen,

ich habe ein kleines Problem auf welches ich bis jetzt keine Antwort gefunden habe.
Und zwar starte ich ein Programm mittels open.
Nun werden aber 2 Prozesse erstellt:

Code: (dl )
1
2
root       806  0.0  0.1   2324  1100 pts/2    S    14:49   0:00 sh -c /usr/bin/unace2 x '/data/A156/entpackt/skypdfpro_mf-installer-133-en-20050630.zip-ent/setup.exe-ent/setup.exe' &> /dev/null
root 807 103 0.0 4892 248 pts/2 S 14:49 0:09 /usr/bin/unace2 x /data/A156/entpackt/skypdfpro_mf-installer-133-en-20050630.zip-ent/setup.exe-ent/setup.exe


Eine Shell und einmal das richtige Programm.
Leider benötige ich die PID im Programm, was ja normalerweise funktionieren würde. Ich bekomme aber leider nur die PID vom Shell Prozess zurück. Wenn ich nun diesen killen möchte läuft mein richtiger unace2 Prozess weiterhin.

Die Funktion mit der ich das externe Programm starte sieht folgendermassen aus:

Code: (dl )
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
# Funktion zum starten eines Entpacker Programms
sub start_prog
{
my $prog = $_[0];
my $text = '';
my @return;

$pid = open(FH,"$prog |") or die $!;
while (<FH>)
{
$text .= $_;
}
close (FH);
$pid = 0;
$return[0] = $?;
$return[1] = $text;

return @return;
}


Vielleicht hat jemand eine Idee? Mit system() habe ich es auch schon getestet. Wenn sich hier mein Perlskript beendet, bleibt hier der unace2 Prozess auch erhalten.
Strat
 2005-06-30 18:28
#55866 #55866
User since
2003-08-04
5246 Artikel
ModeratorIn
[Homepage] [default_avatar]
hilft vielleicht system und das kommando nicht als string, sondern als liste uebergeben, z.b.
Code: (dl )
system("/bin/unace2", "-x", "file1.ace");

usw.
perl -le "s::*erlco'unaty.'.dk':e,y;*kn:ai;penmic;;print"
http://www.fabiani.net/
ptk
 2005-06-30 18:42
#55867 #55867
User since
2003-11-28
3645 Artikel
ModeratorIn
[default_avatar]
Wenn man noch die Pipe dazu braucht, sollte man sich "Safe Pipe Opens" in perlipc angucken.
subsys
 2005-07-01 11:36
#55868 #55868
User since
2005-03-08
27 Artikel
BenutzerIn
[default_avatar]
Hab mir das mal durchgelesen und etwas rumprobiert. Muss aber ehrlich sagen, dass ich es noch nicht ganz verstanden habe.

Ich habe jetzt mal -| benutzt, aber es wird immer noch an die shell übergeben. Das mit system() zu trennen, ala
Code: (dl )
system("/bin/unace2", "-x", "file1.ace");

ist bei mir leider schlecht, da ich immer einen String in die Funktion übergebe und ich es nur schlecht wieder trennen kann. Besteht bei system() evtl. die Möglichkeit die PID des neu gestarteten Prozesses irgendwie rauszubekommen ?
subsys
 2005-07-01 12:09
#55869 #55869
User since
2005-03-08
27 Artikel
BenutzerIn
[default_avatar]
Vielleicht nochmal etwas vereinfacht:

Ich möchte, dass wenn mein Programm sich beendet, alle Child Prozesse bzw. die von meinen Programm gestartet wurden auch getötet werden.
Strat
 2005-07-01 15:20
#55870 #55870
User since
2003-08-04
5246 Artikel
ModeratorIn
[Homepage] [default_avatar]
wenn du in den parametern keine leerzeichen hast, reicht vermutlich auch:
Code: (dl )
my $rc = system(split(/\s+/, $prog));

sonst teste mal:
Code: (dl )
my $rc = system(split(/\s+/, $prog, 2));
\n\n

<!--EDIT|Strat|1120216858-->
perl -le "s::*erlco'unaty.'.dk':e,y;*kn:ai;penmic;;print"
http://www.fabiani.net/
subsys
 2005-07-01 18:30
#55871 #55871
User since
2005-03-08
27 Artikel
BenutzerIn
[default_avatar]
Wenn ich system() benutze, bekomme ich aber keine PID, welche ich bei Bedarf killen kann. So läuft dann das gestartete Programm weiter und weiter und weiter.

Ich glaube ich gebe das Projekt einfach auf.
ptk
 2005-07-01 21:30
#55872 #55872
User since
2003-11-28
3645 Artikel
ModeratorIn
[default_avatar]
Mach dann doch einfach
Code: (dl )
1
2
3
4
5
6
7
my $pid = fork;
if ($pid == 0) {
exec $prog, "bla", foo";
die $!;
}
# ... irgendwann
kill 9 => $pid;
<< >> 8 Einträge, 1 Seite



View all threads created 2005-06-30 17:55.