Ciclo Herramientas gnu/linux (V): pbzip2 y pigz

Hoy comentando con un compañero un filesystem (una partición) que se estaba quedando sin espacio, le he indicado que usase el pbzip2, que lo había dejado yo instalado hace unos días por el mismo problema (y unos ficheros de log enormes).

La verdad es que la teoría es bastante simple, ya que lo único que añade es la opción de paralelismo (pbzip2) sobre bzip2, pero el resultado es bastante impresionante si no quieres esperar a que termine la compresión para irte a casa:

[cc lang=”bash”]
[SERVER02].root:/logs/common/core > time bzip2 -9fv core-2559-1321322015
core-2559-webseald-1321322015: 22.662:1, 0.353 bits/byte, 95.59% saved, 638181376 in, 28161115 out.

real 0m56.240s
user 0m55.379s
sys 0m0.850s
[/cc]
vs
[cc lang=”bash”]
[SERVER02].root:/logs/common/core > time pbzip2 -9fvp16 core-2559-1321322015
Parallel BZIP2 v1.0.5 – by: Jeff Gilchrist [http://compression.ca]
[Jan. 08, 2009] (uses libbzip2 by Julian Seward)

# CPUs: 16
BWT Block Size: 900k
File Block Size: 900k
——————————————-
File #: 1 of 1
Input Name: core-2559-webseald-1321322015
Output Name: core-2559-webseald-1321322015.bz2

Input Size: 638181376 bytes
Compressing data…
——————————————-

Wall Clock: 4.103929 seconds

real 0m4.106s
user 0m55.404s
sys 0m0.923s
[/cc]

En este caso lo que se comprime es un core dumped de un proceso interno y la diferencia está clara (aún usando solo 16 cores de los 64 de la máquina).
Eso sí, si hay un sistema de monitorización muy sensible por medio, puede que salte alguna alarma.

EDIT: Añado pigz que aunque soy fan de bzip2, gzip se usa de manera mucho más habitual…

The easiest way to start X

Yesterday while reinstalling Arch in the x86_64 flavour :-) I was thinking which will be the best way to start X window system.
I want to start my X window’s without user prompt (so CDM is not an option), and I don’t any of common login-managers (gdm, xdm, kdm or slim)… I’ve tried to use the simplest way, and it works!

Let’s go, deps:
[cc lang=”bash”]
pacman -Ss xorg-xinit screen
[/cc]
And optional:
[cc lang=”bash”]
pacman -Ss xterm xort-twm
[/cc]
Cool? ;-) Of course, you must have the X-window (1 &2) system installed and your preferred lightweight desktop manager.

Add your super-power-user:
[cc lang=”bash”]
useradd -s /bin/bash -c “super-power-user” dodger
[/cc]

And now the script:
[cc lang=”bash”]
vim /etc/rc.d/autofluxbox
[/cc]
[cc lang=”bash”]
#!/bin/bash -x
LOGDIR=/var/log/autofluxbox
[ ! -d $LOGDIR ] && mkdir $LOGDIR
exec 1> $LOGDIR/autofluxbox.$(date +%Y%m%d%H%M).log
exec 2> $LOGDIR/autofluxbox.$(date +%Y%m%d%H%M).err
USER=dodger
STARTX=”/usr/bin/startx”

su – ${USER} -c “screen -S Fluxbox_startup -d -m ${STARTX}”
[/cc]

And:
[cc lang=”bash”]
chmod +x /etc/rc.d/autofluxbox
[/cc]
One thing I’ve just found is ${PATH} seems to be wrong on my X environment ¬¬’… I will continue investigating.

Strange feature in bash script

Today, while programming (or reprogramming) some parts of one script, I’ve noticed a strange thing.
First, the two scripts.

The working one:

#!/bin/bash
let x=0
echo -e "a\nb\nc\nd" > auxfile
while read LINE
do
[[ "${LINE}" =~ ^(a|c|d)$ ]] && AUX[$x]=${BASH_REMATCH[1]} && let x++
done < auxfile
echo ${AUX[@]}

And the not working (for my purpose):

#!/bin/bash
let x=0
echo -e "a\nb\nc\nd" | while read LINE
do
[[ "${LINE}" =~ ^(a|c|d)$ ]] && AUX[$x]=${BASH_REMATCH[1]} && let x++
done
echo ${AUX[@]}

The only difference between both is just the piped while.
Someone can explain why seems to be a “reset vars” at the end of the piped while?

Ciclo Herramientas gnu/linux (IV): roxterm y urxvt

Hoy comento una utilidad que no es de consola (MOG!), sino una “consola” en sí; vaya un emulador de terminal.
Por supuesto, en la búsqueda de “algo” ligero, configurable y con suficientes “features” nos hace pasar por la página de “lightweight applications” en la wiki de Arch.

Diría que he probado todos:

  • LilyTerm: Violación de segmento al arrancar la 2ª ventana, diría que tiene procesos separados para cada ventana.
  • Sakura: Procesos independientes, no excesivamente pesado.
  • Xterm: Procesos independientes, pesado.
  • Tilda: Procesos independientes, pesado.
  • Stjerm: no me gusta el dropdown, partiendo de eso, no lo he probado demasiado.
  • urxvt: Muy buen combo urxtvd+urxvtc, lo he estado usando hasta que se han solucionado los problemas del roxterm
  • ROXTerm: Un proceso por N ventanas, muy ligero

Lo que busco en un terminal (imagino que lo que todos ¬¬’):

  • Custom colors: básico para ver los colorines de nuestro tty!!! (htop rulez)
  • Custom Shortcuts: hay que poner las cosas como a uno le gusta, no como alguien te obligue ;-)
  • Lightweight: por descontado
  • Mult-tabs/Multi-windows

Para apreciar la diferencia con urxvtd, pongo una captura de la memoria, ambos con las mismas pestañas, ejecutando los mismos procesos en ellas:
[cc lang=”bash”]dodger 1240 0.0 2.9 447892 60588 ? S Sep09 8:47 urxvtd -q -o -f
dodger 24726 0.9 0.9 53812 19676 pts/15 Sl 17:57 0:03 roxterm
[/cc]
Como comentaba antes, Roxterm ha tenido problemas con la configuración de los shortcuts durante unas cuantas versiones, al menos en mi caso. Y he estado usando urxvtd+urxvtc, también de manera muy satisfactoria.
La verdad que el sistema de configuración mediante .Xdefaults es un poco… arcaico, pero al final te acostumbras.
Tiene cosas buenas, como por ejemplo el cambio de pestaña mediante “ALT + ->” y “ALT + <-" y una cosa que a todo geek le gustará que son las tabs en ASCII si se ejecuta el urxvt mediante: [cc lang="bash"]urxvtc -pe tabbed[/cc] De momento, me quedo con roxterm (aunque las pestañas en GTK no molen tanto), sí que ocupa mucho menos y los ficheros de configuración son "humanos", tal vez no admita las 10e10 opciones de urxvt, pero sí que admite las necesarias ;-) Ahora pongo la config que he estado usando para urxvt [cc lang="bash"] vi .Xdefaults[/cc] [cc lang="bash"] ! General urxvt*termName: rxvt urxvt*loginShell: true urxvt*scrollBar: true urxvt*scrollBar_right: true urxvt*secondaryScroll: true URxvt*scrollstyle: plain urxvt*saveLines: 65535 urxvt*cursorBlink: false urxvt*urgentOnBell: true !urxvt*override-redirect:false !urxvt*borderLess: false !urxvt*internalBorder: 0 !urxvt*externalBorder: 0 ! Extensions urxvt*perl-lib: /usr/lib/urxvt/perl/ urxvt*perl-ext-common: default,matcher,searchable-scrollback urxvt*urlLauncher: /usr/bin/firefox urxvt*matcher.button: 1 ! - catch ugly URLs ! Tabs ! Appearance ! - use a bitmap font !urxvt*font: -*-terminus-medium-*-*-*-12-*-*-*-*-*-*-* !urxvt*boldFont: -*-terminus-bold-*-*-*-12-*-*-*-*-*-*-* !URxvt*font: xft:DejaVu Sans Mono:pixelsize=12:antialias=true:hinting=true URxvt*font: xft:Monospace:pixelsize=12:antialias=true:hinting=true URxvt*boldFont: xft:Monospace:bold:pixelsize=12:antialias=true:hinting=true ! - use xft for drawing fonts !urxvt*font: xft:Terminus:5 !urxvt*font: 9x20 ! - cursor urxvt*cursorColor: #DCDCCC ! - pseudo transparency !urxvt*shading: 50 !urxvt*transparent:true ! ! - color scheme !urxvt.background: #000000 urxvt.background: #171717 urxvt.foreground: #EBEBFF ! black + red !urxvt*color0: #3f3f3f urxvt*color0: #000000 urxvt*color1: #e01010 ! green + yellow urxvt*color2: #00AA00 urxvt*color3: #FFFF00 ! blue + purple ! urxvt*color4: #112037 urxvt*color4: #4092cf urxvt*color5: #A020F0 ! cyan + white urxvt*color6: #5B5BC7 urxvt*color7: #fefefe ! bright-black + bright-red urxvt*color8: #6a6a6a urxvt*color9: #FF5555 ! bright-green + bright-yellow urxvt*color10: #90EE90 urxvt*color11: #ffff2f ! bright-blue + bright-purple urxvt*color12: #5B5BC7 urxvt*color13: #e628ba ! bright-cyan + bright-white urxvt*color14: #7D7DFB urxvt*color15: #ffffff [/cc] Mi configuración de colores de roxterm: [cc lang="bash"] vi .config/roxterm.sourceforge.net/Colours/dodger [/cc] [cc lang="bash"] [roxterm colour scheme] foreground=#eeeeeeeeecec background=#000000000000 0=#2e2e34343636 1=#cccc00000000 2=#4e4e9a9a0606 3=#c4c4a0a00000 4=#34346565a4a4 5=#757550507b7b 6=#060698989a9a 7=#d3d3d7d7cfcf 8=#555557575353 9=#efef29292929 10=#8a8ae2e23434 11=#fcfce9e94f4f 12=#72729f9fcfcf 13=#adad7f7fa8a8 14=#3434e2e2e2e2 15=#ffffffffffff 16=#4c4c4c4c4c4c 17=#a8a830303030 18=#202088882020 19=#a8a888880000 20=#555555559898 21=#888830308888 22=#303088888888 23=#d8d8d8d8d8d8 cursor=#eeeeeeeeecec palette_size=16 [/cc] Y los shortcuts: [cc lang="bash"] vi .config/roxterm.sourceforge.net/Shortcuts/dodger [cc] [cc lang="bash"] [roxterm shortcuts scheme] File/New Window=n
File/New Tab=t
File/Close Window=q
File/Close Tab=w
Tabs/Previous Tab=Left
Tabs/Next Tab=Right
Edit/Copy=c
Edit/Paste=v
View/Zoom In=plus
View/Zoom Out=minus
View/Normal Size=0
View/Scroll Up One Line=Up
View/Scroll Down One Line=Down
Help/Help=F1
Edit/Copy & Paste=y
File/New Window With Profile/Default=
File/New Tab With Profile/Default=
[/cc]

Para aplicar estos cambios:
[cc lang=”bash”]
cp .config/roxterm.sourceforge.net/Global .config/roxterm.sourceforge.net/Global.backup
sed -i ‘s,colour_scheme=.*,colour_scheme=dodger,g’ .config/roxterm.sourceforge.net/Global
sed -i ‘s,shortcut_scheme=.*,shortcut_scheme=dodger,g’ .config/roxterm.sourceforge.net/Global
[/cc]

El backup es por si acaso, nunca está de más ;-)

Ciclo Herramientas gnu/linux (III): screen (gnu/screen)

Y llegamos a una de mis herramientas favoritas y sin la que prácticamente no me planteo la administración de un servidor.
Sobre todo conociendo como van las conexiones españolas.

Haciendo copy/paste del manual:

Screen is a full-screen window manager that multiplexes a physical terminal between several processes (typically interactive shells).

Tradución/interpretación: Screen es un emulador de terminal des-atachado que permite multiplexación de terminales.
Es decir, permite lanzar un proceso que es no es dependiente de un terminal; ya que todos los procesos de usuario en linux cuelgan de un terminal, aunque los mandemos a background y a no ser que usemos dtach.
Esto soluciona el problema de la reconexión, es decir, lanzar un programa de larga duración sin logar la salida y luego hacer el típico:

Se me ha colgado la conexión y no sé como ha finalizado!!!

Que fijo que a cualquier sysadm le ha pasado, habitualmente por despiste (trollface again).

Aparte de esta propiedad, tiene la gran ventaja de que permite lanzar “pestañas” (por hacer un símil) dentro de la misma conexión, es decir, N shells dentro de una única.
Por supuesto también permite splitting de la ventana en regiones (horizontales y depende de si screen está parcheado, verticales), aunque en mi caso soy contrario a usarlas por que es un poco “paja mental”, pero he de reconocer que en ocasiones viene muy bien.

La configuración la realizamos mediante el típico: [cc lang=”bash”]${HOME}/.screenrc[/cc]
Pongo el mío como ejemplo:
[cc lang=”bash”]deflogin on
vbell on
vbell_msg ” Wuff —- Wuff!! ”
defscrollback 1024
bind ^k
bind ^\
bind \\ quit
bind K kill
bind I login on
bind O login off
bind } history
termcapinfo vt100 dl=5\E[M
hardstatus off
termcapinfo xterm*|rxvt*|kterm*|Eterm* hs:ts=\E]0;:fs=\007:ds=\E]0;\007
hardstatus string “%h%? users: %u%?”
termcapinfo xterm*|linux*|rxvt*|Eterm* OP
termcapinfo xterm ‘is=\E[r\E[m\E[2J\E[H\E[?7h\E[?1;4;6l’
defnonblock 5
caption always “%{+b rk}%H%{gk} |%c %{yk}%d.%m.%Y | %72=Load: %l %{wk}”
hardstatus alwayslastline “%?%{yk}%-Lw%?%{wb}%n*%f %t%?(%u)%?%?%{yk}%+Lw%?”
[/cc]

Que nos genera algo como esto (eliminando la parte de htop):
Ejemplo de configuración de screen

Lo importante son las 2 últimas lineas visibles:
[cc lang=”bash”]
ciberterminal |12:12 14.09.2011 | Load: 0,25 0,24 0,18
0*$ bash 1-$ bash 2$ bash 3$ bash 4$ bash
[/cc]
Donde apreciamos:

  1. hostname, fecha, load avg.
  2. “Pestañas” disponibles

De esta forma de manera muy rápida y visual, apreciamos cuantas pestañas tenemos y el estado del servidor.

Otra propiedad adicional e intersante, es el clipboard propio, el scrolling y la posibilidad de salvar lo que aparecen el terminal (todo resumido con el nombre de “copy mode”.

Añado un “resumen” de mis shortcuts más usados, que en este caso son muchos:

##CONNECTION## From outside screen
screen
launch a new screen
screen -S NAME
launch a new screen with name “NAME”
screen -m PROGRAM
launch a screen and inside it the “PROGRAM”
screen -d -m PROGRAM
launch a DE-ATTACHED screen and run “PROGRAM” inside
screen -ls
launch a new screen
screen -x
bruteforce attach
screen -r SCREENAME
attach to screen “SCREENAME”
##INSIDE SCREEN##
CTRL-a c
New screen “tab”/session
CTRL-a n
Next “tab”
CTRL-a p
Prev “tab”
CTRL-a N
Go to tab N
CTRL-a "
Tab list
exit
exit current tab
CRTL-d
exit current tab
CTRL-a A
Change Current tab name
CRTL-a d
de-attach screen
CRTL-a C
clear current tab screen
CRTL-a l
reset current tab screen
CTRL-a K
Destroy (literally) current tab
##SPLITTING##
CTRL-a S
Split current tab horizontally
CTRL-a |
Split current tab vertically
CTRL-a <tab>
Switch to next region
CTRL-a X
Close current region
##COPY/PASTE##
CTRL-a <esc>
Enter copy mode
<Space>
Begin selection (use arrows to move)
<Enter>
Finish selection and copy
CTRL-a ]
Paste
CTRL-a >
Write clipboard to file /tmp/screen-exchange
CTRL-a <
Read /tmp/screen-exchange to clipboard
CTRL-a =
Remove /tmp/screen-exchange but no clipboard content
##SCROLL##
CTRL-a <esc>
Enter copy mode
AvPag
Advance 1 page
RePag
Previous page
Inicio
Go to the 1st line of scroll
Fin
Go to the last line of scroll (actual one)
CRTL+r <SEARCH STRING>
Enter Search mode (begin writing), then

CRTL+r

to go to the previous ressult

/<SEARCH STRING>
Enter VIM-like search
Ciclo Herramientas gnu/linux (II): finch

Nivel freak rallando el tope…
Un cliente de mensajería instantánea basado en ncurses. Más bien pidgin en ncurses.
Dejando a parte a centerim, el aspecto de finch es igual al de pidgin… solo que en consola.
Es decir, tiene “ventanas”, pestañas (si quieres) y la ventana de amigos. Pero también tiene workspaces dentro del propio programa (algo así como “pestañas” de screen) donde poder clasificar las ventanas: por ejemplo las ventanas de chat en un workspace y la lista de amigos en otro.

Un ejemplo de funcionamiento habitual:
finch en funcionamiento
Link al autor de la imagen

Por supuesto cuenta con cliente de los protocolos habituales: jabber, msn, irc, icq…

Como se puede ver en la página del manual, parte de la configuración se realiza en el finchero:
[cc lang=”bash”]${HOME}/.gntrc[/cc]
En mi caso por ejemplo:
[cc lang=”bash”][Finch]
mouse = 1
color-available = green; black
color-away = blue; black
color-idle = gray; black
color-offline = red; black
color-message-sent = cyan; default
color-message-received = red; default
color-message-highlight = black; green
color-message-action = yellow; default
color-timestamp = blue; default
#See below for details on color

[general]
shadow = 0
# There is experimental mouse support
mouse = 1
# To use some custom window-manager
wm = /usr/local/lib/gnt/s.so
# There’s also a custom window manager called irssi.so
# Remember window-positions based on the titles (on by default)
remember_position = 1
# Use borderless one-line high buttons
small-button = true

# Workspaces are created simply by adding Workspace-X groups as follows:
[Workspace-1]
name = blist
# window-names specifies that windows with these semi-colon separated names are placed into this workspace
window-names = buddylist;debug-window

[Workspace-2]
name = IM
window-names = conversation-window
# window-titles specifies that windows with these semi-colon separated titles are placed into this workspace. These are matched as substrings. Window titles take precedence over names.
window-titles = Preferences;Pounce
[/cc]

Casi todo está por defecto, exceptuando el tema de los workspaces, que en mi caso separo las “conversation-window” en el Workspace-2 del resto en el Workspace-1.

Y por qué usar este programa en vez de los super-bonitos clientes actuales, en mi caso como no me canso de repetir… ram:
[cc lang=”bash”]dodger 1266 0.0 1.0 65268 20684 pts/0 Ss+ Sep09 3:26 finch[/cc]
Por los +100MB de pidgin por ejemplo.
Otra cosa es que al final te acostumbras a los shortcuts de finch y como todo trabajador de la consola, no puedes estar sin ellos.
Como ejemplo, pongo algunos (los más usados):

####shortcut####
ALT+a
List of avalaible actions
ALT+n
Next window
ALT+p
Prev window
ALT+w
window list
ALT+c
Close window
ALT+q
Quit
ALT+m
Move window
ALT+r
Resize window
ALT+s
window list
ALT+.
Move the position of the current window in the window list one place to the right.
ALT+,
Move the position of the current window in the window list one place to the left.
ALT+l
Refresh the windows. Useful after resizing the terminal window.
ALT+1..0
Jump to the 1st, 2nd … 10th window.
CRTL+o
Bring up the menu (if there is one) for a window.
ALT+>
Switch to the next workspace
ALT+<
Switch to the previous workspace
AvPag RePag
Scroll text page up/page down
In the buddy list->F11
Add buddy

Completito, vaya… Más en el manual o en la docu oficial.