[Date Prev][Date Next] [Thread Prev][Thread Next] [Date Index] [Thread Index]

Re: Kommunikation vorhandener Prozesse mit anderem tty oder pts einstellen?



Am Freitag, den 04.05.2007, 21:56 +0200 schrieb Helmut H. Franke:

> Vermutlich nicht.  Oder ist es mit screen auch
> möglich, Prozesse, die man nicht unter screen
> gestartet hat, zu steuern?
> 
> Soweit ich weiß, kann man damit nur Prozesse
> beeinflussen, die man von screen aus gestartet
> hat.

Das ist korrekt.
Ich hab heute mal einige Zeit für dich gegurgelt und (wie erwartet)
nicht gefunden.
Der Grund liegt in den zusammenhang der Prozesse.

Beispiel:
Du verbindest dich zu einem host der für dich eine shell startet.
In dieser shell startet du ein Programm.
Dieses Programm ist ein Kind von der shell und per default bekommt der
Prozess sein Input von der shell gibt sein Output an die shell weil
diese das Contol Terminal des Prozesses ist.
Die Prozesse untereinander verständigen sich über Signale.
Wenn der Prozess fertig ist, sendet er das Signal CHLD an sein
Elternprozess und beendet sich. Da die Signale über den Kernel gesendet
werden, weis auch dieser, das der Prozess beendet ist und bereits den
Speicher verlassen hat. Sobald der Elternprozess das Signal entgegen
nimmt, wird der Kindesprozess aus der Prozessliste entfernt.

Für den Fall, daß die Verbindung zur shell abbricht, gibt es das Signal
HUP. Das bedeutet Hang Up und kommt aus dem guten alten Modemzeitalter.
Bricht die Verbindung also ab, erhält die shell das Signal HUP.
Die shell sendet es an ihre Kinder weiter und beendet sich.
Normale Programme beenden sich ebenfalls wenn die das Signal HUP
bekommen. Manche aber nicht, weil sie dazu geschaffen sind, weiter zu
laufen (zB Daemons). Einige Daemons reagieren auf HUP mit dem neuladen
der Config (zB syslogd), aber das ist jetzt Nebensache.
Sollte ein Prozess also auf HUP nicht reagieren und weiterlaufen,
verliert er seinen Elternprozess und wird so zu einem verwaisten
Prozess. Der (Urgroß-)Vater aller Prozesse 'init' nimmt sich solcher
verwaisten Prozesse an und wartet eigendlich nur darauf, daß sie sich
beenden. init ist für solche Prozesse zwar das Control Terminal, gibt
ihnen kein Input und das Output geht an /dev/null.
Sollte sich der Prozess irgenwann mal beenden, schickt er sein
CHLD-Signal an init, der schon mit Sehnsucht auf dieses gewartet hat und
der Kernel freut sich über frei gewordenen Speicherplatz.

Damit du solche Prozesse wieder selber kontrollieren kannst, muss deine
shell zum Elternprozess und Control Terminal des Prozesses werden.
Ich habe kein Programm gefunden, mit dem man Prozesse adoptieren kann.

Zum testen kannst du dir ein shell-Script schreiben, daß in einer
Schleife 'sleep' und 'echo' ausführt.
Dieses Script startest du das mit 'nohup'.

$ nohup ./schleife.sh

Dann schliest du dein Terminal, öffnest wieder ein Terminal und
versuchts diesen Prozess auf dein aktuelles Terminal zu bekommen.
viel Glück

> Alles Gute
> Helmut H. Franke
> 
> -- 
> http://www.worte-des-lebens.net/Vaterworte/vaterworte.html
> http://www.lorber-verlag.de/  http://firethegrid.org/
> http://www.anastasia-de.com/Megre_Buecher/Megre_Buecher.htm
> http://itc.napier.ac.uk/e-Petition/bundestag/
> Avatar Chat Systeme:  http://www.amiculi.net  http://pgm.amoris.org
> Servamus vitam terramque istam, quas amans pater noster ipse dedit nobis!

mfG Sascha

Anmerkung: das Programm 'nohup' ignoriert das Signal HUP und schützt die
mit ihm gestarteten Prozesse ebenfalls davor.




Reply to: