Hallo Tcl/Tk-Freunde, hallo Liste, Zu meinem etwas kniffeligen Problem. Ich habe mir ein kleines Programm geschrieben, mit dem ich meinen ISDNCtrl zwecks Verbindungsaufbau Befehle schicke. Um diesen Vorgang beobachten zu können habe ich nun noch ein Fenster mit einem Textfeld eingebaut, welches mir die in /var/log/messages abgelegten Syslog Ausgaben anzeigt. An dieser Stelle tritt nun folgendes Problem auf. Funktion des Programms soweit korrekt und auch die Anzeige der Syslog Ausgaben funktioniert, will ich aber zwecks Beenden die für die Syslogausgabe notwendige Prozesspipe schliessen, haengt sich das Programm hin bzw. die Prozesspipe wird durch das beenden des Programms nicht automatisch beendet. Die Folge sind dann irgendwelche im Nirvana arbeitenten Programme, welche ich dann von Hand beenden muesste. Die Frage ist nun, wie bekomme ich bei meinem Konstrukt eine PID geliefert, bzw. wie kann ich den Ausgabekanal zur Pipe schließen? Im Folgenden seht Ihr ein Listing der relevanten Proceturen (sind uebrigens aus einem Bespielprogramm eines Buchs und nur etwas abgeaendert fuer meine Beduerfnisse). # Fenster und Widgets bereitstellen proc TAILWin {} { global conf log input if {$conf(20) == 1} { # Set title and allow window resizing. toplevel .tail wm title .tail "xconnect (/var/log/messages)" if {$conf(21) == 1} {wm geometry .tail $conf(22)x$conf(23)+$conf(24)+$conf(25)} # Create a text widget to log the output frame .tail.t set log [text .tail.t.log -width 80 -height 10 \ -borderwidth 2 -relief sunken -bg \#dd5555 -setgrid true\ -font -*-fixed-*-*-*-*-12-*-*-*-*-*-*-* -yscrollcommand {.tail.t.scroll set}] scrollbar .tail.t.scroll -width 10 -borderwidth 1 -command {.tail.t.log yview} pack .tail.t.scroll -side right -fill y pack .tail.t.log -side left -fill both -expand true pack .tail.t -side top -fill both -expand true RUN } } # in dieser Procedur befindet sich benannte Pipe ([catch {open...) ######## proc RUN {} { global command input log but if [catch {open "|tail -f /var/log/messages |& cat"} input] { $log insert end $input\n } else { fileevent $input readable Log $log insert end tail -f /var/log/messages\n $log see end } } # Read and log output from the program proc Log {} { global input log if [eof $input] { TAILStop } else { gets $input line $log insert end $line\n $log see end if {[string match {*Modem hangup*} $line] || [string match {*local hangup ippp*} $line]} {catch RESETButton} } } # Stop the program and fix up the button proc TAILStop {} { global input catch {close $input} } ...ich waere Euch dankbar fuer einen Hilfreichen Tip, wie ich das Problem loesen koennte. Denkbar waere auch ein anderer Loesungsvorschlag fuer mein Vorhaben. Da ich die Konstruktion nicht selbst erdacht habe und auch noch nicht so grosse Erfahrung mit Tcl/Tk habe, kann ich nicht nachvollziehen was eigendlich im Detail passiert. Ich bin daher auf fremde Hilfe angewiesen. Wenn jemand eine deutsche Tcl - Liste kennt, soll mir bitte mitteilen, wo ich diese finde. Ich sage Euch schon jetzt danke und wuensche Euch einen guten Rutsch ins neue Jahr.... Gruss Otti -- ONCE USE LINUX, YOU CANŽT STOP!! ...try it.. mail: a.ott.plauen@t-online.de -- Um aus der Liste ausgetragen zu werden, eine Mail an majordomo@suse.com schicken, mit dem Text: unsubscribe suse-linux
participants (1)
-
a.ott.plauen@t-online.de