Programmausgabe umleiten ?

Status
Für weitere Antworten geschlossen.

ahooge

Neuer User
Mitglied seit
6 Feb 2005
Beiträge
99
Punkte für Reaktionen
0
Punkte
0
Hallo,

ich habe mal eine Frage zu der FBF, was schon fast eine Linux-Frage ist. Wenn ich mir mal Statusmeldungen ansehen möchte, z.B. von "telefon" oder "dsld" geh ich mit Telnet auf die Box und muss diese Programme dann neu starten um die Ausgabe auf dem Terminal zu erhalten.

Gibt es da eine Möglichkeit, die Ausgabe auf mein aktuelles Terminal zu kriegen, ohne das jeweilige Programm neu zu starten ?

Vielen Dank im Vorraus
schöne Grüße
ahooge
 
Hallo ahooge,

einen direkten Weg zur Umleitung (nachträglich ) kenne ich nicht.
Man kann Prozesse aber mit dem Tool strace "belauschen". Dabei werden
sämtliche ! systemcall ausgegeben.

[excursion=unix] ;-)
Prozesse schreiben in der Regel über "Filedeskriptoren" 0 ist stdin, 1 ist stdout, 2 ist stderr, höhere Nummern erhalten zusätzlich geöffnete Files.
=> Mit strace "write" darauf beobachten => Daten sind sichtbar.
[/excursion]
strace help schrieb:
# ./strace --help
./strace: illegal option -- -
usage: strace [-dffhiqrtttTvVxx] [-a column] [-e expr] ... [-o file]
[-p pid] ... [-s strsize] [-u username] [-E var=val] ...
[command [arg ...]]
or: strace -c [-e expr] ... [-O overhead] [-S sortby] [-E var=val] ...
[command [arg ...]]
-c -- count time, calls, and errors for each syscall and report summary
-f -- follow forks, -ff -- with output into separate files
-F -- attempt to follow vforks, -h -- print help message
-i -- print instruction pointer at time of syscall
-q -- suppress messages about attaching, detaching, etc.
-r -- print relative timestamp, -t -- absolute timestamp, -tt -- with usecs
-T -- print time spent in each syscall, -V -- print version
-v -- verbose mode: print unabbreviated argv, stat, termio, etc. args
-x -- print non-ascii strings in hex, -xx -- print all strings in hex
-a column -- alignment COLUMN for printing syscall results (default 40)
-e expr -- a qualifying expression: option=[!]all or option=[!]val1[,val2]...
options: trace, abbrev, verbose, raw, signal, read, or write
-o file -- send trace output to FILE instead of stderr
-O overhead -- set overhead for tracing syscalls to OVERHEAD usecs
-p pid -- trace process with process id PID, may be repeated
-s strsize -- limit length of print strings to STRSIZE chars (default 32)
-S sortby -- sort syscall counts by: time, calls, name, nothing (default time)
-u username -- run command as username handling setuid and/or setgid
-E var=val -- put var=val in the environment for command
-E var -- remove var from the environment for command
#


Problem dabei: strace zeigt sämtliche Calls => Ausfiltern notwendig, sonst sieht man viele Systemcalls wie z.B. time, "read" zum Poll (ist schon was da ..), etc.

strace bringt seine Ausgabe auf "stderr (2)". grep liest von stdin. Deshalb in der Pipe: stderr von strace auf "stdout" umleiten => Pipe bringts zu grep...

  • Prozess-Id mit ps -ef suchen => Im Beispiel 319
  • -s 250 setzen ( sonst würden nusr 32 Byte von dem Strings ausgegeben
  • Falls der Prozess "forked" ( Also Kinder "kriegt" und für sich arbeiten läßt) "-f" nutzen.
Beispiel für "voipd":

# ./strace -s 250 -p 329 2>&1 | grep ^write
Code:
write(-1, "<14>Feb  9 12:24:23 voipd[329]: incoming(4:appl=2 plci=0x204 ncci=0x0 incoming): 11  <- 0\0", 90) = -1 EBADF (Bad file descriptor)
Feb  9 12:24:23 voipd[329]: incoming(4:appl=2 plci=0x204 ncci=0x0 incoming): 11  <- 0
write(9, "Feb  9 12:24:23 voipd[329]: incoming(4:appl=2 plci=0x204 ncci=0x0 incoming): 11  <- 0\r\n", 87) = 87
write(6, "!\0\2\0\2\203\367\6\4\2\0\0\1\0\t\0\0\0\0\0\0\0\0\0\0\0\0\5\0\0\0\0\0", 33) = 33
write(6, "\f\0\2\0\10\203v\4\4\2\0\0", 12) = 12
write(6, "\f\0\2\0\4\203y\4\4\2\0\0", 12) = 12
write(-1, "<14>Feb  9 12:24:23 voipd[329]: disconnected(appl=2 plci=0x204 ncci=0x0 incoming): remote: 0x0000 (0x0000) - No additional information\0", 135) = -1 EBADF (Bad file descriptor)
Feb  9 12:24:23 voipd[329]: disconnected(appl=2 plci=0x204 ncci=0x0 incoming): remote: 0x0000 (0x0000) - No additional information
write(9, "Feb  9 12:24:23 voipd[329]: disconnected(appl=2 plci=0x204 ncci=0x0 incoming): remote: 0x0000 (0x0000) - No additional information\r\n", 132) = 132
write(8, "trigger", 7)                  = 7
write(8, "trigger", 7)                  = 7
write(8, "trigger", 7)                  = 7
write(8, "trigger", 7)                  = 7
write(8, "trigger", 7)                  = 7
write(8, "trigger", 7)                  = 7
write(-1, "<14>Feb  9 12:26:09 voipd[329]: incoming(4:appl=2 plci=0x204 ncci=0x0 incoming): 11  <- 0\0", 90) = -1 EBADF (Bad file descriptor)
Feb  9 12:26:09 voipd[329]: incoming(4:appl=2 plci=0x204 ncci=0x0 incoming): 11  <- 0
write(9, "Feb  9 12:26:09 voipd[329]: incoming(4:appl=2 plci=0x204 ncci=0x0 incoming): 11  <- 0\r\n", 87) = 87
write(6, "!\0\2\0\2\203\370\6\4\2\0\0\1\0\t\0\0\0\0\0\0\0\0\0\0\0\0\5\0\0\0\0\0", 33) = 33
write(6, "\f\0\2\0\10\203}\4\4\2\0\0", 12) = 12
write(6, "\f\0\2\0\4\203\200\4\4\2\0\0", 12) = 12
write(-1, "<14>Feb  9 12:26:09 voipd[329]: disconnected(appl=2 plci=0x204 ncci=0x0 incoming): remote: 0x0000 (0x0000) - No additional information\0", 135) = -1 EBADF (Bad file descriptor)
Feb  9 12:26:09 voipd[329]: disconnected(appl=2 plci=0x204 ncci=0x0 incoming): remote: 0x0000 (0x0000) - No additional information
write(9, "Feb  9 12:26:09 voipd[329]: disconnected(appl=2 plci=0x204 ncci=0x0 incoming): remote: 0x0000 (0x0000) - No additional information\r\n", 132) = 132
#

Was verwundern könnte: gemischter "output": liegt daran, dass voipd von sich aus schon mit auf der session schreibt.
"-1" als Filedescriptor: muss an dem strace liegen. Weiss nicht wieso.

Theoretisch sollte man mit "lsof" eine Zuordnung "Descriptor" => Filename sehen. lsof habe ich aber nicht für die Box.
strace muss man per ftp auf die Box holen und "chmod +x" machen.

Aber vielleicht hat jemand anders eine "einfachere Idee" ?

Haveaniceday

PS: Hoffentlich habe ich dich nicht zu doll verwirrt..
 

Anhänge

  • strace.tar.gz
    92.9 KB · Aufrufe: 9
Hi,

ja hellelujah. Da stellt man ne kleine Frage und kriegt gleich ein komplettes Tutorial ;-)
Vielen, vielen Dank. Das klappt. So krieg ich die Meldungen raus.

Eine Frage hab ich dazu aber noch. Ich hab mir mittels wget die Datei auf die Box in /var/tmp gezogen. Bleibt die dort nach nem reboot vorhanden ?

Schöne Grüße
ahooge
 
Bleibt leider bei einem Reboot nicht erhalten.
In meinem "mod-05.2 war leider auch nicht genug Platz für das Tool um im Flash zu bleiben.

Haveaniceday
 
Hi,

mmh. Irgendwie schein ich etwas voreilig gewesen zu sein. Bei Voipd usw. scheint das zu gehen. Nur gerade bei "telefon" nicht. Irgendwie werden immer alte Meldugen wiederholt (bei jedem Ereignis). Und dan steht da soetwas, wie
write(7, "...", 256) = -1 EIO (Input/Output Error)

Und die Meldungen laufen dann voll oft durch den Bildschirm. Viiiiel öfter, als wenn ich die Ausgabe mit "killall telefon; telefon" beobachte.
Außerdem, wie gesagt, nicht aktuelle Meldungen, sondern alte.

Dazu vielleicht eine Idee, noch ?

Vielen Dank im Voraus
Schöne Grüße
Axel
 
Das ist der Nachteil von strace. Gibt alles aus.

Du kannst aber mit "| grep -v write\(7" dieses wiederum ausfiltern.

Nachteil bei 2 x pipe im Befehl: Die ausgabe erfolgt immer nur wenn der buffer voll ist.
Alternativ kannstdu aber auch gleich mit dem richtigen "| grep write\(... " nur den gewollten Teil ausgeben.

Haveaniceday
 
Ich stehe irgendwie gerade auf men Schlauch.

Ich stelle eine Telnetverbindung zur Box her, gebe mein Webkennwort ein und warte. Abgehender Anruf, die Daten fliessen, ankommender Anruf - nichts.

Wie kann ich dies so umleiten, dass ich es im Telnet sehen kann (alles ungefiltert)? Danke.
 
Hi.
Welche Daten siehst du? Poste doch mal ein Log.
Was siehst du, wenn du vor dem Gespräch den telefon neu startest?
Code:
~ # killall telefon
~ # telefon 2>&1
telefon: use clock_gettime(CLOCK_MONOTONIC)!
telefon: set initial telefon time from linux time to 12:38 14.07 2005!
sizeof TA_DATA = 0x2d94!
telefon: Read TA_Charge ignorerd!
Setupdaten geslesen!
telefon: found SIP Controller 4
telefon: found POTS Controller 3
telefon: found ISDN Controller 2
AB_LED: Power On
~ # telefon: socket accept from: 127.0.0.1
Connect_h: Slot[1] Ctrl(4) MSN(0) CPN()
* state change slot 1 ID 0: D_ConnectPending Reason: 0*
ID 0 BChan (ext) 0x06
* state change slot 1 ID 0: D_ConnectPending Reason: 0*
AB_LED: B2 On
* state change slot 1 ID 0: D_DisconnectPending Reason: 0*
14.07.05 12:38     0s Slot: -1 CIP: 4                SIP0 outgoing
       ChargeU:    0
* state change slot_hold 1 ID 0: Disconnected Reason: 3400*
Disconnectreason: 3400
AB_LED: B2 Off
MfG Oliver
 
@olistudent
Kann kein Log posten, da nichts ausgegeben wurde, nach ausführen deines genannten Befehl klappt es hingegen! Danke für den Tipp!
 
Danke nochmals, jetzt funzt schon mal das erste.
Alle Festnetzanrufe werden jetzt ganz normal vom ISDN-CAPI-WATCH [BETA] per Telnet abgearbeitet. So bald ich Zeit habe baue ich auch noch die SIP-Anrufe ein und stelle es online.
 
hallo,

eine frage hätte ich?

was bewirkt bei telefon 2>&1

das 2>&1? kann das jemand mal kurz für mich entschlüsseln?

gruß
notrenotre
 
Hi.
Google ist dein Freund. ;-)
13.2.4 Shellumleitung
Grundlegende Umleitungen zum Einprägen ([n] ist eine optionale Nummer die den Datei-Descriptor spezifiziert):

[n]> Datei Umleiten von stdout (oder n) zu Datei.
[n]>> Datei Anhängen von stdout (oder n) an Datei.
[n]< Datei Umleiten von stdin (oder n) von Datei.
[n1]>&n2 Umleiten von stdout (oder n1) zu n2.
2> Datei >&2 Umleiten von stdout und stderr zu Datei.
> Datei 2>&1 Umleiten von stdout und stderr zu Datei.
| Kommando stdout an Kommando weiterreichen.
2>&1 | Kommando stderr und stdout an Kommando weiterreichen.
MfG Oliver
 
Mal eine ganz doofe Frage, kann man nicht syslogd dazu missbrauchen, die ganzen Ausgaben bequem standardisiert per UDP Port 514 an einen Syslog-Server zu schicken?
 
Anscheinend schon.
Könnte sich ja mal einer der JFritz entwickler dazu äußern.
Ich habe das schon probiert über eine pipe, ungefähr so:
telefon 2>&1|logger&
Aber da kommen die Nachrichten nicht sofort an, sondern erst wenn neue kommen. Also zu spät.

MfG Oliver
 
Status
Für weitere Antworten geschlossen.
Holen Sie sich 3CX - völlig kostenlos!
Verbinden Sie Ihr Team und Ihre Kunden Telefonie Livechat Videokonferenzen

Gehostet oder selbst-verwaltet. Für bis zu 10 Nutzer dauerhaft kostenlos. Keine Kreditkartendetails erforderlich. Ohne Risiko testen.

3CX
Für diese E-Mail-Adresse besteht bereits ein 3CX-Konto. Sie werden zum Kundenportal weitergeleitet, wo Sie sich anmelden oder Ihr Passwort zurücksetzen können, falls Sie dieses vergessen haben.