Schrift
[thread]8052[/thread]

Prozess Starten und PID speichern: ohne open

Leser: 1


<< >> 9 Einträge, 1 Seite
bloonix
 2006-06-03 17:51
#66977 #66977
User since
2005-12-17
1615 Artikel
HausmeisterIn
[Homepage]
user image
Hallo Leute,

ich möchte gerne einen Prozess starten, die PID des Prozesses
speichern und dann nichts weiter tun, als den Prozess arbeiten zu
lassen, ohne STDIN oder STDOUT des Prozesses zu beeinflussen.

Mein erster Lösungsanzatz ist folgender (allerdings mit open()):

Code: (dl )
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
use strict;
use warnings;

my $pid = open my $CMD, "| sar -c 1 2 \&>/dev/null" or die $!;

while (1) {
open my $STAT,'<',"/proc/$pid/stat" or die $!;
my $state = (split /\s+/, <$STAT>)[2];
close $STAT;

if ($state eq 'Z') {
close $CMD or die $!;
waitpid($pid,0);
last;
}

sleep 1;
}


Dieses Verfahren gefällt mir allerdings garnicht! Ich möchte den
Prozess einfach nur starten und die PID speichern, mehr nicht.

Kennt jemand eine elegantere Lösung, ohne das ich alle /proc/<pid>
Verzeichnisse nach dem Prozess absuchen muss?

Gruß,
opi\n\n

<!--EDIT|opi|1149346357-->
What is a good module? That's hard to say.
What is good code? That's also hard to say.
One man's Thing of Beauty is another's man's Evil Hack.
pq
 2006-06-03 19:31
#66978 #66978
User since
2003-08-04
12208 Artikel
Admin1
[Homepage]
user image
wieso geht fork nicht? der prozess muss halt nur ohne shell
gestartet werden:
Code: (dl )
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
$ cat forked.pl
#!/usr/bin/perl
use strict;
use warnings;
open FH, ">forked.dat" or die $!;
print FH "forked $$\n";
close FH;
print STDERR "This should not appear ($$)\n";

$ perl -wle'
if (my $pid = fork()) {
 print "parent $$ forked $pid";
}
elsif (defined $pid) {
 close STDERR;
 exec qw(perl forked.pl);
}
'
parent 29747 forked 29748

$ cat forked.dat
forked 29748
\n\n

<!--EDIT|pq|1149348750-->
Always code as if the guy who ends up maintaining your code will be a violent psychopath who knows where you live. -- Damian Conway in "Perl Best Practices"
lesen: Wiki:Wie frage ich & perlintro Wiki:brian's Leitfaden für jedes Perl-Problem
bloonix
 2006-06-03 20:12
#66979 #66979
User since
2005-12-17
1615 Artikel
HausmeisterIn
[Homepage]
user image
Perfekt! Danke pq!
What is a good module? That's hard to say.
What is good code? That's also hard to say.
One man's Thing of Beauty is another's man's Evil Hack.
bloonix
 2006-06-03 20:19
#66980 #66980
User since
2005-12-17
1615 Artikel
HausmeisterIn
[Homepage]
user image
[quote=pq,03.06.2006, 17:31]wieso geht fork nicht? der prozess muss halt nur ohne shell
gestartet werden:[/quote]
Ich war mir nicht ganz sicher, was alles bei fork bzw. exec vererbt wird.

In meinem Skript benötige ich die PID, da ich mir verschiedene
Statistiken zu dem Prozess aus /proc/<pid> zusammenstelle wie
zum Beispiel Speicherverbrauch, CPU-Zeiten etc. und dachte, dass
mittels fork die Statistiken nicht brauchbar sind. Beispiel:

Ich lese eine 10 MB große Datei ein und forke dann den Prozess.
Der Parent und der Child- Prozess haben beide die gleiche
Programsize, etwas über 10 MB, was ja auch korrekt ist (alles getestet).
Jetzt kommt aber das exec und der Prozess wird mit dem Kommando
neu gestartet und erbt nur die PID, nicht aber die Programsize. Wenn
das nicht so wäre, dann könnte ich den Prozess nicht "benchmarken".

Aber es klappt wunderbar, mit exec erhält der Prozess einen komplett
neuen Speicherstack (wenn das so richtig ist), nur die PID wird
vererbt.

Danke.\n\n

<!--EDIT|opi|1149351815-->
What is a good module? That's hard to say.
What is good code? That's also hard to say.
One man's Thing of Beauty is another's man's Evil Hack.
bloonix
 2006-06-03 20:29
#66981 #66981
User since
2005-12-17
1615 Artikel
HausmeisterIn
[Homepage]
user image
Da fällt mir gerade noch ein...

Der Nachteil von fork ist, dass ich den doppelten Speicher verbrauche,
da der Parent-Prozess kopiert wird. Mir wäre es lieber, wenn ich den
Prozess starten und die PID speichern könnte.

Aber da gibt es bestimmt auch noch eine Lösung.
What is a good module? That's hard to say.
What is good code? That's also hard to say.
One man's Thing of Beauty is another's man's Evil Hack.
GwenDragon
 2006-06-03 20:48
#66982 #66982
User since
2005-01-17
14532 Artikel
Admin1
[Homepage]
user image
Wie wäre es mit CPAN:Proc::Simple Prozess im Hintergrund starten ;)

Code: (dl )
1
2
3
$proc = Proc::Simple->new();
$status = $proc->start("/bin/echo", "hello", "world");
$pid = $proc->pid;
\n\n

<!--EDIT|GwenDragon|1149353563-->
die Drachin, Gwendolyn


Unterschiedliche Perl-Versionen auf Windows (fast wie perlbrew) • Meine Perl-Artikel

bloonix
 2006-06-04 19:00
#66983 #66983
User since
2005-12-17
1615 Artikel
HausmeisterIn
[Homepage]
user image
Hi pq,

[quote=pq,03.06.2006, 17:31]
Code: (dl )
1
2
3
...
elsif (defined $pid) {
close STDERR;
[/quote]

dass close reicht leider nicht, da die Ausgabe des Prozesses über
STDOUT weiterläuft und wenn ich ein close STDOUT; einhänge,
dann beendet sich der Prozess.

Ich habe es einfach so gemacht...

Code: (dl )
1
2
open STDOUT,'>','/dev/null';
open STDERR,'>','/dev/null';


Gruß,
opi
What is a good module? That's hard to say.
What is good code? That's also hard to say.
One man's Thing of Beauty is another's man's Evil Hack.
bloonix
 2006-06-04 19:07
#66984 #66984
User since
2005-12-17
1615 Artikel
HausmeisterIn
[Homepage]
user image
[quote=GwenDragon,03.06.2006, 18:48]Wie wäre es mit CPAN:Proc::Simple Prozess im Hintergrund starten ;)[/quote]
jo, ein feines modul! ich hab mir sogar ein bisschen was abgeguckt,
auf was der autor alles so geachtet hat, aber gebrauchen kann ich es
nicht wirklich, da ich direkt mit start des prozesses eigene strukturen
aufbauen muss...
What is a good module? That's hard to say.
What is good code? That's also hard to say.
One man's Thing of Beauty is another's man's Evil Hack.
bloonix
 2006-06-04 21:46
#66985 #66985
User since
2005-12-17
1615 Artikel
HausmeisterIn
[Homepage]
user image
Hallo,

ich habe da ein kleines Problem, ich weiß nicht, wie ich am besten
eine Liste von Hashkeys durchlaufen soll. Ich habe eine Liste von
Prozess-IDs und sobald alle Prozesse nicht mehr existieren, möchte
ich aus einer while-Schleife springen.

Ich habe nun 3 Beispiele, weiß aber nicht genau, was der optimalste
Vorgang wäre. Für einen Tipp wäre ich dankbar.

Hier die Beispiele, alle ungetestet:

Code: (dl )
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
use strict;
use warnings;

# die Prozess-IDs habe ich jetzt mal beispielhaft angelegt
my $self = {};
$self->{23} = {};
$self->{64} = {};
$self->{745} = {};
my @pids = ();

# 1. Beispiel
@pids = keys %$self;
while (@pids) {
for my $pid (@pids) {
@pids = grep { !/^$pid$/ } @pids unless -e "/proc/$pid";
}
}

# 2. Beispiel
@pids = keys %$self;
while (@pids) {
for my $i (reverse 0..$#pids) {
splice(@pids, $i, 1) unless -e "/proc/$pids[$i]";
}
}

# 3. Beispiel
$self->{$_}->{run} = 1 for keys %$self;
my $count = keys %$self;
while ($count) {
for my $pid (sort keys %$self) {
next unless $self->{$pid}->{run};
unless (-e "/proc/$pid") {
$count--;
$self->{$pid}->{run} = 0;
}
}
}


Gruss,
opi\n\n

<!--EDIT|opi|1149443483-->
What is a good module? That's hard to say.
What is good code? That's also hard to say.
One man's Thing of Beauty is another's man's Evil Hack.
<< >> 9 Einträge, 1 Seite



View all threads created 2006-06-03 17:51.