PDA

Archiv verlassen und diese Seite im Standarddesign anzeigen : Shellscript: Ausgabe von aptitude ergänzen


#44
2010-09-23, 18:05:16
Es geht um folgendes:

Ich habe mir ein Shellscript gebastelt, das mir für meine VMs aptitude startet, so dass ich im Regelfall nur noch bei der Nachfrage zur Paketbestätigung etwas (y/n) tippen muss:

#!/bin/bash

veids=`sudo vzlist -Ho veid` # listet die blanken veids auf

for i in $veids
do
echo -e "\n------------------------------ updating veid $i ------------------------------\n"
sudo vzctl exec $i "aptitude update && aptitude safe-upgrade" | sed "s/^/Container $i: /"
done


Der Teil, der die Ausgabe nun durch sed piped ist das Problem. Da sed nur ganze Zeilen bearbeitet, sieht das jetzt so aus:



-------------------- updating veid 107 --------------------

[...]
Container 107: The following packages will be upgraded:
Container 107: libssl0.9.8
Container 107: 1 packages upgraded, 0 newly installed, 0 to remove and 0 not upgraded.
Container 107: Need to get 2860kB of archives. After unpacking 65.5kB will be used.
y
Container 107: Do you want to continue? [Y/n/?] Get:1 http://fr.archive.ubuntu.com hardy-updates/main libssl0.9.8 0.9.8g-4ubuntu3.10 [2860kB]


Die Zeile, die eigentlich die Nachfrage enthält, wird so lange zurückgehalten, bis ich Enter drücke, da sie erst dann eine vollständige Zeile ist. Sie taucht also erst nach der Eingabe auf!

Die Anzeige der Downloadgeschwindigkeit funktioniert auch nicht, scheinbar weil die Ausgabe nicht direkt auf der Konsole erfolgt sondern nach sed. Es scheint auch noch andere Probleme zu geben, zumindest bekam ich eben folgende Meldung:
dpkg-preconfigure: unable to re-open stdin:

Was bei ncurses Dialogen, die ja auftauchen könnten, passiert weiss ich auch nicht.

Gibt es also eine andere Möglichkeit, vor die Ausgabe (von aptitude) in jede Zeile "Container [veid]: " zu schreiben? Oder muss ich damit leben, dass ich nur meine "Überschrift" zwischenrein schreiben kann? Das könnte ich ja zwischen update und safe-upgrade wiederholen, aber anders wäre es mir lieber. Denn gerade wenn mehrere Pakete aktualisiert werden kommt viel Text hinzu und die Überschrift verschwindet...

mii
2010-09-24, 10:29:39
hi :)

hab mir dazu auch mal kurz Gedanken gemacht.

Eine Möglichkeit wäre:

Das Upgrade nur simulieren. (-s ??) Dabei sollte ja ebenfalls angezeigt werden, was durchgeführt werden soll.

Dann eine abfrage ob man das so durchführen möchte.
Es sollte bei der Abfrage ein timeout mit default "no" als antwort vorhanden sein.
Wenn "yes" dann das aptitude update mit dem parameter "-y" ausführen, was ohne rückfrage einfach aktualisiert.

hilft dir das weiter? :)

#44
2010-09-30, 14:22:53
Damit ist mir nicht geholfen, denke ich. Ich will ja die originale Ausgabe live sehen und eben nur ein kleines Prefix haben, damit ich, auch wenn ich während dem Aktualisieren den PC verlasse, beim Zurückkommen sofort weiß was Sache ist.

Bis auf Ausgaben, die aktualisiert werden (wie z.B. die kb/s von aptitude; ncurses Oberflächen?) funktioniert das auch.

Da es auf bash-Ebene nicht möglich scheint, gibt es evtl. eine Chance das von mir verwendete LXTerminal (0.1.3) zu manipulieren? Das dann der Tab- bzw. Fenstertitel die entsprechende Info enthält? Ich werd' jetzt mal in diese Richtung googeln...

€: Auf bash-ebene könnte ich noch $PS1 manipulieren, oder? Hat da jemand mehr Ahnung als ich? ;D
€2: Hmm nee doch eher nicht, da meine Ausgabe ja keinen Prompt enthält...
€3: Ausser natürlich der Prompt ist auch immer der Tab-Titel... :usad:

mii
2010-09-30, 15:22:55
Terminal-Titelleiste manipulieren? :)

PS1="$PS1\[\033]0;TEST\007"

hilft dir das? ^^

#44
2010-09-30, 16:24:40
Ein Stück weit :) Wenn ich das so eingebe klappt es und dank Google verstehe ich auch die Syntax.

Wenn es aber im Script läuft passiert nichts. Liegt wohl daran, dass für Scripts eine Subshell (http://lowfatlinux.com/linux-execute-script.html) gestartet wird.
Starte ich das Script mit ". script" wird die Variable zwar verändert, die Änderung tritt aber erst in Kraft, wenn der nächste Prompt zu sehen ist, was effektiv erst nach dem Durchlauf des Scripts der Fall ist...

Ideen?

mii
2010-10-01, 11:10:00
Leider fällt mir da aktuell auch nichts mehr ein, was deine Fragen beantwortet.

Vieleicht wäre ne idee, das mittel Screen(http://www.manpagez.com/man/1/screen/) zu lösen.
Das also eine Screen-Session den Namen der VM hat und mittels Splitscreen anzeigen, welche VM das ist.
Somit weißt du immer, welche Session das gerade ist und du kannst sogar mehrere Aktualisierungen gleichzeitig starten.