Seiten

Samstag, 20. Oktober 2012

Hintergrundprozesse zum Schweigen bringen

Ich teste gerade uzbl. Gestartet habe ich den Browser über ein xterm, um auch zu sehen, welche Meldungen (Debugging, Errors) das Programm ausgibt.
Das sind mitunter (gerade auf Blogger, GMail und Youtube) einige.

Da uzbl im Hintergrund läuft, ich es nicht beenden will, und die Meldungen von uzbl mich dabei stören, mit vim eine Konfigurationsdatei zu bearbeiten, muss uzbl jetzt sozusagen im Nachhinein zum Schweigen gebracht werden.

Das geht, wenn auch nur mit ein paar Tricks, erstaunlich gut:

#> uzbl-tabbed &
[3] 16611
#> vim config

Hier wird es jetzt nervig, uzbl stört vim mit seiner Ausgabe erheblich. Also weg mit der Ausgabe:

# CTRL - Z (Tastenkombination)
#          vim ist nun angehalten im Hintergrund)
#> jobs -pl

[2]+ 16542 Angehalten              vim config
[3]- 16611 Läuft                  uzbl-tabbed &
#> gdb -p 16611
(gdb) p dup2(open("/dev/null",0),1)
(gdb) p dup2(open("/dev/null",0),2)
(gdb) detach
(gdb) quit
#> fg

Und schon herrscht Stille :)

Was hier im Einzelnen passiert:
jobs -pl liefert mir die PID der nervigen Prozesses, danach kann per GDB an diesen Prozess "angedockt" werden. Dabei wird die Ausführung des Prozesses angehalten (der Browser bleibt also stehen, reagiert nicht mehr). Die folgenden Anweisungen zeigen (print) das Ergebnis des jeweiligen Ausdrucks dahinter.
Das ist jeweils der Aufruf einer Funktion dup2(int old, int new), welche bewirkt, dass der File Descriptor new (wenn nötig, was es in unserem Fall ist) geschlossen und anschließend zur Kopie des File Descriptors old gemacht wird.
Die Folge davon ist, dass danach in new zu schreiben effektiv das Gleiche ist, wie in old zu schreiben.

Wenn nach diesen beiden Zeilen also in File Descriptor 1 (stdout) bzw. 2 (stderr) geschrieben wird, ist dies der gleiche Vorgang wie nach /dev/null (den File Descriptor für diese "Datei" erhalten wir dank open) zu schreiben.

Die Ausgabe an stdout und stderr wird somit also nachträglich, ohne das Programm beenden zu müssen, nach /dev/null umgeleitet. Damit das nun verstummte Programm weiterläuft muss GDB mittels detach wieder "abgekoppelt" werden.

Ein quit führt zurück auf die Konsole / das Terminal und mittels fg kommt vim wieder in den Vordergrund.


Quellen:


Freitag, 19. Oktober 2012

systemd und dkms

Da mein Laptop nun mit systemd und einem neuen System läuft ist es Zeit, so langsam mal alles zum funktionieren zu bringen.

Dazu gehört auch mein Festplattenschutz, der über hdapsd und tp_smapi läuft. Beides ist unter Arch Linux einfach aus dem Repository zu installieren, hat aber folgenden Haken:
Die Module werden bei einem Kernelupdate nicht unbedingt gleich aktualisiert.

Da ist DKMS schon bequemer: Wenn ein neuer Kernel installiert wurde, werden die Module automatisch für den neuen Kernel gebaut.
Automatisch? Nur, wenn dkms autoinstall ausgeführt wird, was aber Dank der beiliegenden systemd Unit einwandfrei funktioniert.

Anstatt tp_smapi muss also einfach nur tp_smapi-dkms aus dem AUR installiert werden.

Bei mir braucht es dann noch ein
options thinkpad_ec force_io=1
unter /etc/modprobe.d/thinkpad_ec.conf und eben systemctl enable hdapsd.service und systemctl enable dkms.service.

Toll, wenn etwas einfach mal funktioniert!

Mittwoch, 17. Oktober 2012

systemd - Ein erster Versuch

systemd ist nun quasi Standard in Arch Linux, der Distribution meiner Wahl. Zeit, darauf umzustellen, dachte ich mir dann letzte Woche.

Normalerweise teste ich "so neues Zeug" gerne möglichst früh, habe das bei systemd aber aus zwei Gründen hinausgeschoben:

1) Mein Laptop ist mein Produktivsystem. Ohne funktionierendes System bin ich ziemlich aufgeschmissen, gerade, was das Studium angeht.

2) Ich gehöre mit zu den Nutzern, die die Umstellung auf pulseaudio unter Ubuntu Hardy "hautnah" miterlebt haben (Bis Gnome endlich OHNE pulseaudio lief hatte ich mich fast schon an die absolute Stille gewöhnt). Der Name "Lennart Poettering" war mir also noch in etwas negativer Erinnerung (was nichts über seine Person aussagt, ich kenne ihn nicht, erlaube mir deshalb anders als einige andere auch kein Urteil).

Ich wollte einfach sicher gehen, dass ich nicht das gleiche Debakel wie bei pulseaudio erlebe. Gerade so "neuartige" (was die umgesetzten Ideen und Konzepte angeht) Software bringt ja zu Beginn gerne einen Haufen Probleme beim Zusammenspiel mit dem restlichen Programmen. Nach und nach integriert sich solche Software ja aber auch (wie bei pulseaudio) bzw. die Umgebung passt sich daran an.

Ich bin also nach der Anleitung im Wiki von archlinux.org vorgegangen, Schritt für Schritt. Meine Konfigurationsdateien habe ich geändert, sprich den Hostnamen in /etc/hostname eingetragen, Konsolenschriftart usw. in /etc/vconsole.conf gesetzt, Lokalisierung und Zeitzone eingestellt und die zum Starten (nicht zwingend) notwendigen Kernelmodule in Dateien unter /etc/modules-load.d/ eingetragen.

Zu den tmpfiles gehört auch noch eine andere Geschichte ...

Dann systemd installiert und init=/bin/systemd an die Kernelparameter angehängt.

Neugestartet...

... und eine mit lauter grünen "OK"s gespickte Bootausgabe gesehen, aber kein getty / Login.

Ok, STRG + ALT + ENTF löste glücklicherweise einen Reboot aus, also habe ich im Bootloader die Kernel cmdline geändert und mit dem "alten" Init gebootet. Einige systemctl enable später folgte dann Versuch 2, mit selbigen Ergebnis. Mit einer gewissen Frustration habe ich dann den Laptop erstmal in Ruhe gelassen, fand dann aber bei meiner Rückkehr einen fertig gebootetes System samt Login wieder.

Ein systemd-analyse plot ergab dann Folgendes:
(In voller Größe, ca 1,2 MB)

Mehr als 100 Sekunden, um meinen Laptop zu starten? o.O
Irgendwas läuft da doch gewaltig schief, mit dem alten Init ging es immerhin in rund 14 Sekunden bis zum getty ...

Es schien / scheint auch irgendwie mit dem Networkmanager zusammenzuhängen, also habe ich wieder versucht weitere Services zu aktivieren.

Mit dem Resultat, dass bei einem Neustart das System eingefroren ist. Angezeigt wurde mir wieder die mit lauter "OK"s gespickte Konsole, das System reagierte aber weder auf irgendwelche Tastenkombinationen (MagicSysRq hatte ich deaktiviert ...) noch auf andere Ereignisse (Laptop-Deckel schließen, Hardwareschalter für Drahtlos-Verbindungen etc)

Da mir kein Weg eingefallen ist, das zu lösen, ist das System nun immernoch in diesem Zustand. Starten kann man es glücklicherweise ja noch ohne systemd.

Das heißt aber nicht, dass ich jetzt ohne systemd arbeite, eine Neuinstallation von Arch Linux mit systemd funktioniert jetzt ohne größere Probleme zu machen.

Das alte System habe ich aber noch auf einen USB Stick kopiert, vielleicht finde ich noch die Lösung...