Linux

You are currently browsing the archive for the Linux category.

Hace poco me he encontrado en la necesidad de mandar automáticamente una tarea de fondo en un servidor remoto. Se trata de lanzar un script de bash y que se ejecute permanentemente dentro de su propio terminal aislado.

La automatización la hago con Ansible. Ansible es una herramienta (libre; GPLv3) de gestión de configuraciones pero también de orquestación y de despliegue. Permite la creación de recetas que hacen los despliegues complejos reproducibles. Pero lo mejor es que escala muy bien hacia abajo (y hacia arriba) y permite hacer fácilmente tareas sencillas.

Los comandos byobu, tmux o screen permiten la ejecutar tareas de fondo en un terminal que se mantiene abierto aunque se cambie de estación de trabajo. Se puede enviar un comando dentro de un terminal de estos programas, desconectarse del terminal, cambiar de equipo y volver a conectarse a ese terminal. Mientras tanto, el comando se sigue ejecutando sin problemas. En nuestro caso vamos a mandar un comando con Ansible a un ordenador remoto para que se quede ejecutándose de fondo y poder recuperar un terminal en un momento posterior.

Con Ansible se puede crear una tarea como esta:

tasks:
 - name: launch profile process
   command: "screen -dmS profile bash -c 'cd /mnt/data/log; python /home/ubuntu/scripts/profile_node.py'; sleep 1"
   async: 45
   poll: 0

Estas líneas hacen lo siguiente:

  • Usamos el módulo command para lanzar el comando.
  • Con el screen -dmS profile le decimos a screen que mande la tarea en una sesión cuyo sufijo sea «profile» y que no se conecte a ella sino que la deje de fondo.
  • Dentro de screen lanzamos bash y le decimos que ejecute el comando que hay entre comillas simples.
  • El comando cambia de directorio y ejecuta el script «/home/ubuntu/scripts/profile_node.py».
  • Al final del comando ponemos un «sleep 1» ya que, aparentemente, Ansible y fabric requieren ese truco para que no haya problemas al lanzar una sesión de screen.
  • Por último usamos «async: 45» para que Ansible mande la tarea de forma asíncrona y «poll: 0» para que no intente comprobar su estado nunca. El resultado final es que la tarea se manda y Ansible se despreocupa de ella.

El comando se queda ejecutándose dentro de una sesión de screen. Más tarde podemos hacer login en el ordenador remoto y conectarnos a la sesión de screen para ver el estado en que se encuentra la ejecución del comando:

  • Con «screen -ls» se obtiene una lista de las sesiones de screen disponibles.
  • Si hay varias sesiones, nos interesa la sesión cuyo nombre acabe en «profile», por ejemplo «1234.profile».
  • Para conectarse a esa sesión se usa «screen -r 1234.profile».

Como comentario adicional, la conexión a screen se puede realizar desde dentro de un panel de byobu o tmux. Si las combinaciones de teclas de control son las mismas que las de screen, no es posible controlar la sesión desde dentro de estos entornos. Esto no sería un problema si solo se quiere comprobar el estado de ejecución del programa. Al cerrar el panel de tmux o byobu la sesión de screen sigue ejecutándose en su entorno sin problema.

Tags: , ,

Vidyo es un sistema de videoconferencia muy usado en entornos empresariales. Funciona en múltiples plataformas incluido Linux. Cuando se instala el cliente en Linux, se activa por defecto el inicio automático y Vidyo se carga cada vez que se entra en el entorno de escritorio. Una de las opciones de configuración permite, en teoría, desactivar este inicio automático, pero no funciona en la práctica.

Para desactivar el inicio automático hay que editar el archivo vidyo-vidyodesktop.desktop en el directorio .config/autostart de nuestro home (por ejemplo /home/danflavin/.config/autostart). En ese archivo añadiremos al final la siguiente línea:

Hidden=true

Al reiniciar el escritorio, Vidyo no debería aparecer automáticamente a partir de ahora.

Fuente: The Autostart folders in KDE/Linux

Tags: , ,

De vez en cuando es necesario rellenar algún formulario que está en formato pdf. Esto puede ser todo un problema si el pdf no ha sido creado como un formulario interactivo que se pueda editar o si el creador se olvidó de marcar la opción de «Rellenar los campos de formulario» como permitida (cosa absurda pero más común de lo que pueda parecer). Además, muchas veces ocurre que este tipo de formularios hay que rellenarlos con urgencia.

En Linux hay un programa muy sencillo que permite escribir texto sobre un documento pdf. Se llama flpsed. La interfaz de usuario no es muy llamativa pero el programa hace justo lo que promete que es escribir texto sobre el pdf para después poder guardarlo en otro pdf o imprimirlo.

El programa flpsed acaba de pasar a mi caja de herramientas para manipular pdfs junto con pdfjam o qpdf.

Vía: http://bioinformatiquillo.wordpress.com/2008/10/09/flpsed-escribir-sobre-pdfs/

Tags: ,

Hace un tiempo explicaba como dividir un archivo de texto usando sed. El problema de este método es que no sirve para archivos binarios y que hay que hacer una estimación a ojo de la longitud del corte. En esta entrada se explica un método mejor para dividir cualquier tipo de archivo o directorio de forma automática. Este método funciona directamente en sistemas operativos tipo UNIX, como Mac OS X o Linux, donde vienen instalados por defecto tar y split.

Como explicábamos antes, el tamaño máximo de archivo en un sistema FAT32 es de 4GiB. Si queremos transportar un archivo de tamaño mayor en un disco duro o una memoria USB formateada con este sistema de ficheros, necesitaremos dividirlo.

División del archivo

El archivo se empaqueta y comprime usando tar y se divide en trozos de 4000 MB usando split. Finalmente se copia en el dispositivo de destino:

tar -cvpz /ruta/archivo | \
split -d -a 3 -b 4000m - /mnt/disco_fat32/archivo.tar.gz.

Se irán generando trozos del archivo comprido identificados por un número de serie como sufijo (archivo.tar.gz.000; archivo.tar.gz.001; etc). La compresión es opcional –parámetro z del comando tar– pero puede ahorrar bastante espacio según el caso. En lugar de un archivo de entrada podemos indicar un directorio para empaquetar todo su contenido. Los parámetros de split usados indican:

  • -d → que use números como sufijo en lugar de letras.
  • -a 3 → que use 3 cifras. Apropiado para unos 1000 trozos (unos 4 TB tras comprimir).
  • -b 4000m → que separe en trozos de 4000 MB.
  • – → que se use como entrada la entrada estándar stdin.

Recuperación del archivo

Para volver a unir los trozos y obtener de nuevo el archivo o el directorio comprimido en el lugar que elijamos se usa lo siguiente:

cat /mnt/disco_fat32/archivo.tar.gz.* | (cd /ruta_elegida/; tar zxv)

Los trozos son unidos y extraídos por tar en el directorio que hemos denominado ruta_elegida.

Tags: , , ,

En alguna ocasión he necesitado dividir un archivo de texto plano en varias partes. En un momento dado, por ejemplo, necesitaba copiar a un disco formateado en FAT un archivo con comandos SQL que tenía un tamaño de 6.3 GiB. Como mi disco, formateado en FAT, solo acepta archivos de hasta 4 GiB, es necesario dividir el archivo de texto en dos partes. Decidí usar herramientas sencillas (wc, sed y cat) y evitar usar dd. El comando dd es muy versátil y potente; tan potente que puede causar estragos al más mínimo error (parece que en broma se dice que dd es el acrónimo de «destructor de datos»).

División del archivo

En mi caso sé que casi todas las líneas del archivo de texto tienen la misma longitud. Una forma de dividir el archivo sería introducir la primera mitad de las líneas en un nuevo archivo y la segunda en otro. Primero contamos el número de líneas usando wc:

wc sql_data.sql 
   5557603  455721539 6882254952 sql_data.sql

Se puede ver que el archivo tiene 5.557.603 líneas. Introduciré las 2.800.000 primeras líneas en el primer archivo y el resto en el segundo. Para esto se puede usar sed:

sed -n 1,2800000p sql_data.sql > sql_data1.sql
sed -n 2800001,5557603p sql_data.sql > sql_data2.sql

Para volver a juntar las dos partes se puede usar directamente cat:

cat sql_data1.sql sql_data2.sql > sql_data_check.sql

El resultado final son dos archivos con un tamaño inferior a 4GiB:

-rw-r--r--  1 jsm users 3553315243 Jul 31 12:10 sql_data1.sql
-rw-r--r--  1 jsm users 3328939709 Jul 31 12:12 sql_data2.sql
-rw-r--r--  1 jsm users 6882254952 Jul 31 12:17 sql_data_check.sql
-rw-r--r--  1 jsm users 6882254952 Jul 24 16:19 sql_data.sql

Comprobación

Sí quisiéramos comprobar que todo está bien podemos comparar el hash MD5 del archivo inicial con el del archivo recuperado usando cat:

md5sum sql_data.sql 
  13e934907ab22b8b6e0bd2c1b3bb29d0  sql_data.sql
md5sum sql_data_check.sql
  13e934907ab22b8b6e0bd2c1b3bb29d0  sql_data_check.sql

Como se puede ver los dos archivos tienen el mismo hash, indicándonos (en este caso) que son iguales.

Tags: , , ,

Las versiones modernas de Mac Os X llevan instalado un servidor SMTP. Se trata de Postfix, un servidor de correo muy sencillo de configurar y potente. Sin embargo este servicio no se encuentra activado por defecto.

Para que Postfix se arranque al inicio debemos editar el archivo /System/Library/LaunchDaemons/org.postfix.master.plist con nuestro editor favorito. Por ejemplo, con vi:

sudo vi /System/Library/LaunchDaemons/org.postfix.master.plist

Tenemos que añadir dentro del elemento <dict>, al final, las siguientes líneas:

<key>RunAtLoad</key>
  <true />
<key>OnDemand</key>
  <false />
<key>KeepAlive</key>
  <true />

La próxima vez que se reinicie el sistema tendremos Postfix funcionando.

Para arrancar directamente Postfix en este momento podemos mandar esta orden a launchctl:

sudo launchctl start org.postfix.master

De esta manera podremos comprobar si el servicio se está ejecutando en el puerto 25 de nuestro ordenador. Para probar la conexión podemos usar telnet:

telnet localhost 25

Si la conexión funciona tendremos Postfix listo para enviar correos desde nuestro sistema.

Referencias:

 

Tags: , , , , ,

La tableta Samsung Galaxy Tab Wifi (P1010) tiene una pantalla multitactil de 7 pulgadas (unos 17.8 cm), GPS, cámara frontal y trasera, etc. La última versión de Android que usa es la 2.2.1 Froyo. Al situarla en posición vertical, bajo la pantalla hay cuatro botones de función típicos de Android, de izquierda a derecha: preferencias, inicio («home»), atrás y búsqueda.

Cuando se descarga completamente la batería pueden aparecer efectos indeseables. Por ejemplo, los iconos personales de la pantalla de inicio desaparecen, se vuelve a la pantalla de inicio de fábrica y la tecla de inicio deja de funcionar. Esta descarga puede ocurrir si se deja conectada una aplicación que use el GPS.

Para recuperar la funcionalidad de la tecla de inicio se puede conectar la tableta al ordenador con el cable USB en modo Kies. El modo Samsung Kies se selecciona en los ajustes dentro del menú Conexiones inalámbricas y después dentro de Ajustes USB. No importa que se conecte a un ordenador que no tenga instalado el software de Samsung, para desconectar del ordenador se pide que se pulse la tecla de inicio. A partir de ese momento vuelve a funcionar la tecla sin tener que hacer un reinicio duro del sistema que devuelva todo a la configuración de fábrica.

Tags: , , , ,

Con las relativamente nuevas Debian Squeeze y Ubuntu 10.04 me he encontrado con problemas para arrancar el sistema sin interrupciones cuando no encuentra un sistema de archivos definido en el /etc/fstab. En Ubuntu aparece un mensaje en pantalla diciendo algo como «el controlador de disco xxx no esta listo o presente» y pregunta si seguir (skip) o comprobar. Esto puede ser un gran problema cuando se trata de un sistema que se gestiona de forma remota.

Antiguamente, si no se encontraba un sistema de archivos definido en el fstab se ignoraba automáticamente pero ahora no. El comportamiento por defecto ha cambiado radicalmente. En mi caso hay un disco USB que puede no estar disponible en un momento determinado pero que, cuando está, debe montarse de forma automática.

Una solución posible es eliminar la opción «auto» y poner «noauto» en la línea apropiada del fstab. Sin embargo esto nos obligaría a montar a mano el sistema cada vez que lo necesitemos. Al final he conseguido encontrar en askubuntu.com la opción buena. Se añade la opción nobootwait para que el sistema no se pare en el arranque. Así una línea como esta:

UUID=9b0ff8b5-798d-43cf-b3df-72cbb47c87b7 /mnt/data2 ext4 auto,rw 0 0

quedaría así:

UUID=9b0ff8b5-798d-43cf-b3df-72cbb47c87b7 /mnt/data2 ext4 nobootwait,auto,rw 0 0

y el sistema arranca sin parar aunque el dispositivo no se encuentre disponible en ese momento.

A veces es muy útil imprimir varias páginas en una página, para poder hacerse una idea de la estructura de un documento sin tener que desperdiciar papel o para crear patrones más complejos que permitan la impresión de un cuadernillo por ejemplo.
Teniendo el documento preparado en formato pdf existen algunos métodos para manipularlo como gv, pdf2ps, etc, pero suelen requerir de un conocimiento avanzado del comando y muchas veces los resultados no son los deseados. Sin embargo hay una herramienta muy útil y sencilla de usar llamada pdfjam.

pdfjam

La herramienta pdfjam funciona en sistemas tipo UNIX como Linux y Mac y es posible que se pueda instalar en Windows usando algo como cygwin. Permite manipular documentos pdf de muchas maneras de forma muy sencilla. Estos documentos se pueden imprimir luego directamente sin pérdida de calidad, así que teniendo uno o varios documentos en formato pdf, podemos combinarlos y manipularlos a nuestro gusto para obtener el documento impreso final que deseamos. El único inconveniente es que funciona en línea de comandos pero esto le da también parte de su potencia.

Unir dos documentos

Se pueden unir varios documentos pdf en uno con el comando pdfjoin. En un terminal se pondría:

pdfjoin   <doc1.pdf> <doc2.pdf> <doc3.pdf>

y se obtiene como salida un documento llamado doc3-joined.pdf que es la unión de los tres documentos anteriores. Evidentemente se le pueden indicar también dos o más de tres documentos.

Imprimir varios páginas en una página

Para imprimir varias páginas en una página se usa el comando pdfnup. Se escribe en un terminal:

pdfnup --nup 2x4 <doc.pdf>

y la salida es un documento llamado doc-2x4.pdf en el que cada página contiene cuatro páginas del documento original.
Esta funcionalidad es muy útil para imprimir varias transparencias de una presentación en una sola página.

Otras funcionalidades

Con pdfjam-pocketmod se crea una impresión de 8 páginas en una página combinada de manera que doblando y recortando la página según las instrucciones se obtiene un librito de bolsillo. Hay algunos comandos más para rotar, invertir páginas (como en un espejo) o crear un documento tipo cuadernillo, descritos en la página de pdfjam.
Estos métodos no los he encontrado en la instalación por defecto de Debian Lenny. Sin embargo es posible que se encuentren disponibles en las distribuciones más modernas directamente. Si no, siempre existe la opción de compilar el programa desde el código fuente si se requiere alguno de los comandos más exóticos.

Tags: , , ,

Curiosamente algunos documentos en formato electrónico (pdf) vienen protegidos con contraseña. La contraseña hay que teclearla cada vez que se abre el documento y constituye un engorro. También impide abrir el documento si no se dispone de un lector de pdf que soporte este sistema. Es posible usar el programa denominado qpdf en Linux para crear una versión del documento en la que no haya que introducir la contraseña cada vez. El formato es el siguiente:

qpdf --decrypt --password=<contraseña> <documento_entrada>.pdf <documento_salida>.pdf

Afortunadamente una de las editoriales (Apress) que usaba esta «protección» por contraseña para sus libros ha cambiado el sistema y ya ofrece los libros sin este engorro.

Tags: ,

« Older entries