Benutzer:Thomas: Unterschied zwischen den Versionen

Aus LaborWiki
Wechseln zu: Navigation, Suche
Zeile 30: Zeile 30:
Die folgende Bash-pipeline gibt wieder, was Prozess <tt>''PID''</TT> auf seinem file descriptor <tt>''FD''</tt> liest:
Die folgende Bash-pipeline gibt wieder, was Prozess <tt>''PID''</TT> auf seinem file descriptor <tt>''FD''</tt> liest:


  strace -p ''PID'' -e read=''FD'' 2>&1 | egrep "^ \| .....  " | cut -d ' ' -f 4-19 | ruby -n -e 'split().each { |str| $stdout.putc str.hex }'
  strace -p ''PID'' -e read=''FD'' 2>&1 | egrep "^ \| .....  " | cut -b 11-33,35-58 | ruby -n -e 'split().each { |str| $stdout.putc str.hex }'


Geht vielleicht nur bei little endian Rechnern, läßt sich aber leicht anpassen. Auch der Write-Fall ist entsprechend machbar.
Will man sich das Ergebnis ansehen, sollte man noch <tt>| hexdump -C | less</tt> anhängen!


Diese Lösung hängt leider empfindlich vom Ausgabeformat von strace ab.


Geht vielleicht nur bei little endian Rechnern, läßt sich aber leicht anpassen. Auch der Write-Fall ist entsprechend machbar.


==Howto-mäßige Projekte==
==Howto-mäßige Projekte==

Version vom 11. Oktober 2008, 14:33 Uhr

Kontakt

  • Jabber: schnittchen ÄT das-labor PUNKT org

Tipps und Tricks

Dienste, die keine X-Clients sind, mit der Gnome Session starten und beenden

Das Problem: Dienste, die selbst keine X-Clients sind, werden beim Beenden der X-Session nicht automatisch beendet. Es ist nämlich keineswegs so, dass das Gnome Session Management allen eingetragenen Prozessen zum Schluss ein entsprechendes Signal sendet -- vielmehr müssen Clients das Ende der Session daraus ableiten, dass ihre Verbindung zum X-Server stirbt.

Das folgende Skript macht sich zu Nutze, dass die dbus-Session zusammen mit der X-Session stirbt. Ein beliebiger X-Client, der nichts tut (dem Nutzer nicht in die Quere kommt), würde es hier tun. Falls jemandem eine "leichtere" Lösung einfällt: bitte melden!

#!/usr/bin/ruby
SUB_COMMAND = "Pfad des Dienstes"
COMMAND_ARGS = "-d -f blahfu".split
TERMINATE_SIG = "TERM" #Ändere zu INT für den Rails Webrick ./script/server

child = fork { exec(SUB_COMMAND, *COMMAND_ARGS) }
puts child

#ein x-client, der sich mit dem Ende der Sitzung beendet
system("dbus-monitor", "sender='yyy.invalid'")

Process.kill(TERMINATE_SIG, child)
Process.wait(child, Process::WNOHANG)

Dieses Skript anpassen, ausführbar ablegen und in die Gnome-Session eintragen (System->Einstellungen->Sitzungen, Tab Startprogramme).

Auf einem Socket sniffen (unidirektional)

Die folgende Bash-pipeline gibt wieder, was Prozess PID auf seinem file descriptor FD liest:

strace -p PID -e read=FD 2>&1 | egrep "^ \| .....  " | cut -b 11-33,35-58 | ruby -n -e 'split().each { |str| $stdout.putc str.hex }'

Will man sich das Ergebnis ansehen, sollte man noch | hexdump -C | less anhängen!

Diese Lösung hängt leider empfindlich vom Ausgabeformat von strace ab.

Geht vielleicht nur bei little endian Rechnern, läßt sich aber leicht anpassen. Auch der Write-Fall ist entsprechend machbar.

Howto-mäßige Projekte

Dies+Das