Schrift
[thread]6410[/thread]

Ein Befehl als unabhängigen Prozess

Leser: 1


<< >> 10 Einträge, 1 Seite
alexus-777
 2004-07-18 13:57
#84572 #84572
User since
2004-04-13
121 Artikel
BenutzerIn
[default_avatar]
Hallo,

ich starte aus meiner Perl/Tk Programm eine Andere Anwendung mit system Befehl(in UNIX):
Code: (dl )
system qq{anwendung -parameter &};


Das funktioniert schön und Perl/Tk Programm wird dabei nicht blockiert. Aber wenn ich mein Perl/Tk Prog. schließe, wird auch diese Anwendung die ich vorher gestartet habe gekillt.

Wie kann man das vermeiden?

Gruß Alexander
betterworld
 2004-07-18 14:27
#84573 #84573
User since
2003-08-21
2614 Artikel
ModeratorIn

user image
system qq(nohup anwendung -parameter &);
alexus-777
 2004-07-19 00:16
#84574 #84574
User since
2004-04-13
121 Artikel
BenutzerIn
[default_avatar]
danke, ich probiere es aus :)
betterworld
 2004-07-19 00:24
#84575 #84575
User since
2003-08-21
2614 Artikel
ModeratorIn

user image
Das legt dann uebrigens eine Datei nohup.out an mit der Ausgabe Deines Befehls. Die Ausgabe kann schliesslich nicht aufs Terminal gehen, denn dann wuerde der Befehl gekillt werden sobald das Terminal an Existenz verliert.

Jedenfalls solltest Du die Datei bald wieder loeschen, falls das Programm viel Output erzeugt :)
Näheres siehe info nohup\n\n

<!--EDIT|betterworld|1090182699-->
alexus-777
 2004-07-19 09:22
#84576 #84576
User since
2004-04-13
121 Artikel
BenutzerIn
[default_avatar]
danke für Info :)
ptk
 2004-07-19 13:06
#84577 #84577
User since
2003-11-28
3645 Artikel
ModeratorIn
[default_avatar]
Unter welchen Umstaenden wird ein Kindprozess eigentlich gekillt? Wenn ich im folgenden Skript (egal, ob bei fork/exec oder system) das Hauptprogramm schliesse, laueft der andere Prozess weiter:
Code: (dl )
1
2
3
4
5
6
7
8
9
10
11
12
13
14
#!/usr/bin/perl
use Tk;
$mw=tkinit;
if (0) {
if (fork == 0) {
exec "sh", "-c", "while true; do echo kill -9 $$; sleep 1; done";
die $!;
}
} else {
system(q{sh -c 'while true; do echo kill -9 $$; sleep 1; done' &});
}
MainLoop;

END { warn "Exiting main" }
Ishka
 2004-07-19 15:25
#84578 #84578
User since
2003-08-04
771 Artikel
HausmeisterIn
[Homepage] [default_avatar]
mit fork && exit kann ich mich als Kindprozess auf jeden Fall vorm Beendetwerden schützen (zumindestens vor dem, daß ich von meinem Elternprozess mitgetötet werde). Mehr brauch ich gar nicht zu wissen :)
sub z{if(@_){1while$x[$k=rand 10];t($t=$x[$k]=1)}print map"$z[$x[$_]]$_".($_%3?
"":"\n"),1..9}sub t{$j=0;$x[$_+1]==$t&&($j+=2**$_)for 0..8;z,die"Gewinner $z[$t]
"if grep$_==($j&$_),7,56,73,84,146,273,292,448;z,die"Gleichstand\n"if@x>9&&!grep
!$_,@x}@x=4;@z=qw{. [ (};z$^T&1;while(<>){next if$_>9||$x[$_];t$t=$x[$_]=2;z 1}
betterworld
 2004-07-19 17:41
#84579 #84579
User since
2003-08-21
2614 Artikel
ModeratorIn

user image
[quote=ptk,19.07.2004, 11:06]Unter welchen Umstaenden wird ein Kindprozess eigentlich gekillt?[/quote]
Oft senden Prozesse vorm Beenden ein SIGHUP an alle Kinder. Die Standardreaktion darauf ist Selbstmord. Wenn kein SIGHUP kommt, laeuft das Kind als Waise weiter, bis es vielleicht mit einem SIGPIPE gekillt wird, weil das Terminal oder eine Pipe futsch ist.

Ich weiss auch nicht genau, warum alexus-777's Skript seine Kinder mit in den Tod reisst, denn afaik sendet Perl normalerweise kein SIGHUP. Aber egal was der Grund ist, nohup(1) sollte immer funktionieren ;-)
ptk
 2004-07-19 17:46
#84580 #84580
User since
2003-11-28
3645 Artikel
ModeratorIn
[default_avatar]
Ich wollte ja POSIX::setsid als Loesung vorschlagen...
alexus-777
 2004-07-23 08:57
#84581 #84581
User since
2004-04-13
121 Artikel
BenutzerIn
[default_avatar]
Hallo,

@betterworld: nohup funktioniert :) Aber dann sieht man die Ausgaben des Programms in der Eltern-shell nicht. Das ist auch nicht so schlimm, aber mich würde trotzdem Möglichkeit mit fork && exit interessieren.
Kann jemand genauer erklären wie man das macht?

Gruß Alexander
<< >> 10 Einträge, 1 Seite



View all threads created 2004-07-18 13:57.