Schlagwort-Archive: Bash

BitBastelei #204 – Linux-Shell-Erweiterung: Powerline für Bash/vim/tmux & Co

BitBastelei #204 - Linux-Shell-Erweiterung: Powerline für Bash/vim/tmux & Co

(20 MB) 00:13:32

2016-07-17 10:00 🛈

Bild: https://www.adlerweb.info/blog/wp-content/uploads/2016/07/powerline-mini-300×59.pngAls Bastler arbeite ich recht viel auf der Linux-Konsole – ein mächtiges Werkzeug, aber nicht unbedingt übersichtlich. Mit dem Tool „powerline“ kann man mit überschaubarem Aufwand die Shell aufhübschen und um diverse Widgets ergänzen. Während Dinge wie Wettervorhersage für mich eher nach unnötiger Spielerei aussehen sind z.B. Statusinformationen in GIT-Ordnern oder der aktuelle Batteriezustand wertvolle Helfer.

Die Installation kann bei Arch, Gentoo und Debian über bereitgestellte Pakete erfolgen, alternativ lässt sich der distributionsunabhängige Python-Paketmanager „pip“ verwenden. Alle Installationsmethoden werden in der Doku beschrieben.

Konfigurationen

https://gist.github.com/adlerweb/14f7543479645483b01e679d7ca307b7

# Powerline
if [ -f `which powerline-daemon` ]; then
        powerline-daemon -q
        POWERLINE_BASH_CONTINUATION=1
        POWERLINE_BASH_SELECT=1
        . /usr/lib/python3.5/site-packages/powerline/bindings/bash/powerline.sh
fi
let $PYTHONPATH='/usr/lib/python3.5/site-packages'
set rtp+=/usr/lib/python3.5/site-packages/powerline/bindings/vim/
set laststatus=2
set t_Co=256
set -g default-terminal "screen-256color"
powerline-config tmux setup
{
	"segments": {
		"left": [
			{
				"function": "powerline.segments.shell.mode"
			},
			{
				"function": "powerline.segments.common.net.hostname",
				"priority": 10
			},
			{
				"function": "powerline.segments.common.env.user",
				"priority": 30
			},
			{
				"function": "powerline.segments.common.env.virtualenv",
				"priority": 50
			},
			{
				"function": "powerline.segments.shell.last_pipe_status",
				"priority": 10
			},
			{
				"function": "powerline.segments.shell.cwd",
				"priority": 10
			},
			{
				"function": "powerline.segments.shell.jobnum",
				"priority": 20
			},
			{
				"function": "powerline_gitstatus.gitstatus",
				"priority": 40
			}
		],
		"right": [
			{
				"function": "powerline.segments.shell.last_pipe_status",
				"priority": 10
			},
			{
				"function": "powerline.segments.common.vcs.branch",
				"priority": 40
			}
		]
	}
}

 

Renicetree – renice a process including it’s children

./configure && make – aw crap.

Immer wieder passiert es mir, dass ich längere Prozesse starte ohne ein „nice“ davor zu setzen. Ergebnis: Der Kompiliervorgang o.Ä. hat die selbe Priorität wie alles andere und zieht die Reaktionsfähigkeit des PC deutlich in den Keller. Üblicherweise kann man nun mir „renice“ den Prozess nachträglich herunterstufen, jedoch klappt das gerade bei Kompiliervorgängen nicht sonderlich gut: renice ändert lediglich die Priorität des angegebenen Prozesses, hierdurch werden auch neu erstellte Kindprozesse erfasst, bereits laufende jedoch nicht. Da Make teils sehr verschachtelt arbeitet und Jobprozessoren zur Verteilung der Aufträge nutzt muss man z.T. einige Prozesse ändern um das System wieder lauffähig zu machen. Hier z.B. der make-Baum eines OpenWRT:

make(25087)->sh(25209)->make(25211)-|->bash(25214)->make(25237)
                                    |->bash(25229)->make(25240)

Da ich keine Lust mehr hatte ständig die nötigen IDs per Hand zu suchen ist renicetree entstanden. Es sucht alle zu einer PID gehörigen Kindprozesse und setzt auch für diese ein renice ab. Um halbwegs kompatibel zu bleiben ist die Software in einer Bash-Syntax entstanden.

Da ich keinerlei erweiterte Ahnung von Shell-Scripting habe dürfte der Code bei Profis vermutlich Haarraufen verursachen, aber er läuft immerhin – auch wenn mir die Eigenheiten der Bash gewaltig auf den Nerv gingen (Keine mehrdimensionalen Arrays, keine indirekte Variabelreferenzen, etc). Script gibt’s wie immer auf Github. Use at your own risk.


Update: Ich wurde darauf hingewiesen, dass renice über die Process Group ID (-g) eine ähnliche Funktion bereits bieten würde. Das kann ich – zumindest für GUI-Betrieb – nicht bestätigen, hier hat z.B. alles unter meinem Terminal-Emulator die selbe Gruppen-ID, also auch Prozesse, welche in einem anderen Tab gestartet sind.

Linux-Shell/Bash: Passwörter einlesen (read)

Ab und an benötigen Scripte schon mal Passwörter für andere Systeme. Meist finden sich die Passwörter hardcoded im Script oder werden per Argument mitgegeben. Beide varianten haben den Nachteil, dass die Passwörter im Script oder der passenden Log-Datei (z.B. .bash_history) ggf. lesbar sind.

Bei interaktiv genutzten Scripten lässt sich mit „read“ das Passwort in eine Variable einlesen. Mit -s kann das echoing, also die Ausgabe des Passworts während des Eintippens, unterbinden.

read -s -p "Passwort fuer Nutzer123? " pwd
./befehl -u Nutzer123 -p "${pwd}"

Auf der Suche nach den inodes

So ein Linux-Server mit ext4 ist nicht so schnell klein zu bekommen – ich schaffs aber natürlich trotzdem. Auf einem meiner App-Server verabschiedete sich übers Wochenende der Datenbankserver. Diagnose eindeutig: Platte voll, 0 Bype frei. Der Auslöser ist auch schnell ausgemacht – mangels logrotate haben sich über 8GB in /var/log angesammelt. Klare Sache – Logs löschen, Dienste neustarten undnichts. Platte voll. Dafuq? Am Platz liegts nicht – dort sind die 8GB nun frei – ich vermute Böses…

# df -h /
Filesystem Size Used Avail Use% Mounted on
/dev/root 23G 14G 8.2G 62% /
# df -i /
Filesystem Inodes IUsed IFree IUse% Mounted on
/dev/root 1474560 1474560 0 100% /

Treffer versenkt – die Inodes sind voll. Aber warum? Nach kurzem Gegoogle gehe ich davon aus, dass meist eine Datei = ein Inode ist, also wird die Bash-Keule ausgepackt:

(for i in `find / -xdev -type d 2>/dev/null` ;do (echo -n `ls -1a "$i" | grep -vP "^(.|..)$" |wc -l` && echo " - $i") ;done) | sort -n

Dieser Code erzeugt eine Liste aller Ordner auf dem Device der Root-Partition – aufsteigend nach der Anzahl der Dateien sortiert. In meinem Fall ist der Schuldige relativ eindeutig:

[...]
1460 - /usr/share/man/man1
1620 - /usr/portage/metadata/cache/dev-perl
1620 - /usr/portage/metadata/md5-cache/dev-perl
1692 - /usr/portage/metadata/glsa
4554 - /usr/share/man/man3
972513 - /var/nagios/home/.maildir/new

Ich sollte mal ein paar Mails löschen -Oder auch nicht, denn…

rm *
-bash: /bin/rm: Argument list too long

also muss auch hier getrickst werden:
find ./ -exec rm {} +