# rm-rf.es | Administración de sistemas

Blog de un SysAdmin Unix, Gnu/Linux, Windows y lo que haga falta.

Poner un proceso en segundo plano y desasociarlo de la shell

La situación es la siguiente, tenemos una shell bash ejecutando un proceso cuyo tiempo de ejecución va a ser muy largo y necesitamos cerrar la shell, por supuesto no podemos parar el proceso y arrancarlo de nuevo. Para solucionar este problema podemos hacer uso de los comandos bg (recordad el artículo sobre gestión de trabajos en BASH (jobs, fg, bg, &… que escribí hace un tiempo) y disown.

Por ejemplo, tenemos este comando en ejecución que simplemente escribe algo en un fichero de texto cada dos segundos. Lo tenemos en primer plano (fg):

Nota: los paréntesis son porque ejecuto una sub-shell para que interprete todos los comandos (separados por “;” como un único comando.

$ (while true; do echo "prueba - `date`" >> test.txt; sleep 2; done)

Puedo ver que efectivamente escribe cada dos segundos ejecutando un tail al fichero:

$ tail -f test.txt 
prueba - Thu Apr 11 21:11:56 CEST 2013
prueba - Thu Apr 11 21:11:58 CEST 2013
prueba - Thu Apr 11 21:12:00 CEST 2013
prueba - Thu Apr 11 21:12:02 CEST 2013
prueba - Thu Apr 11 21:12:04 CEST 2013

Ahora le vamos a mandar una señal SIGSTOP al proceso. Esto lo detendrá temporalmente. Para ello usamos Ctrl + z “^z”. En la misma shell de bash desde la que lo hemos parado vemos con el comando jobs que el proceso está parado:

$ jobs
[1]+  Stopped                 ( while true; do
    echo "prueba - `date`" >> test.txt; sleep 2;
done )

Ahora lo vamos a pasar a segundo plano (background) con el comando bg:

$ bg
[1]+ ( while true; do
    echo "prueba - `date`" >> test.txt; sleep 2;
done ) &

Y automáticamente el proceso seguirá funcionando, pero ahora ya en segundo plano:

$ tail -f test.txt
prueba - Thu Apr 11 21:17:34 CEST 2013
prueba - Thu Apr 11 21:17:36 CEST 2013
prueba - Thu Apr 11 21:17:38 CEST 2013
prueba - Thu Apr 11 21:17:40 CEST 2013
prueba - Thu Apr 11 21:17:42 CEST 2013

Finalmente ejecutamos el comando disown para desasociar el comando a la shell en la que nos encontramos, ya podremos entonces cerrar con tranquilidad la terminal. Básicamente lo que hace este comando es evitar que se mande una señal SIGHUP al proceso cuando cerramos la shell:

$ disown

Bash y SSH: establecer timeout por inactividad

La variable de entorno TMOUT nos permite definir el tiempo que queremos permitir a un usuario permanecer dentro de la shell o sesión SSH sin hacer nada (estado idle o inactivo). Por defecto no hay límite de tiempo por lo que un usuario podrá permanecer de forma indefinida conectado al sistema independientemente de que la sesión se esté utilizando o no.

Para configurar esta variable, simplemente la añadimos dentro de nuestro perfil de variables/configuraciones de bash ~/.bash_profile o ~/.bashrc. Conviene configurarla como read only para evitar que el propio usuario pueda modificarla:

# Establecemos en 2 minutos (120 segundos) el Timeout para la sesión bash/ssh
TMOUT=120
readonly TMOUT

Refrescamos la shell o entramos y salimos para que sea efectivo:

$ bash

También podemos establecerla a tiempo real mediante export:

$ export TMOUT=120

A partir de ahora, si dejamos la shell abierta durante 2 minutos sin realizar ninguna tarea automáticamente nos desconectará de la sesión:

$ timed out waiting for input: auto-logout

apropos: buscador de comandos en la shell

Es imposible conocer todos los comandos que nos ofrece cualquier shell, para solucionar este “problema” existen herramientas que nos hacen la vida más fácil, una de ellas es el comando apropos.

Apropos es un comando que busca dentro de las descripciones de cada una de las páginas man las palabras claves que le indiquemos pasandolas como argumentos. Estas palabras claves pueden contener comodines o ser la palabra clave exacta.

Por ejemplo, si quisieramos buscar comandos que sirven para copiar ficheros podríamos hacerlo del siguiente modo (suponiendo un sistema en idioma inglés):

$ apropos "copy files"
cp (1)               - copy files and directories
cpio (1)             - copy files to and from archives
install (1)          - copy files and set attributes

Como véis nos muestra tres comandos que pueden servirnos para realizar operaciones de copiado de ficheros. Otro ejemplo podría ser la búsqueda de un comando/programa para gestionar particiones:

$ apropos "partition"
addpart (8)          - simple wrapper around the "add partition" ioctl
cfdisk (8)           - Curses/slang based disk partition table manipulator for Linux
delpart (8)          - simple wrapper around the "del partition" ioctl
fdisk (8)            - Partition table manipulator for Linux
iostat (1)           - Report Central Processing Unit (CPU) statistics and input/output statistics for devices, partitions an...
mpartition (1)       - partition an MSDOS hard disk
partprobe (8)        - inform the OS of partition table changes
partx (8)            - telling the kernel about presence and numbering of on-disk partitions.
sfdisk (8)           - Partition table manipulator for Linux

Como véis es un comando muy útil en situaciones que no conocemos un comando para realizar una determinada tarea.

Escanear rango de Ips

Existen muchas formas de escanear desde shell un rango de IPs o subnet, por ejemplo con nmap o creando un script en bash, perl, etc. No obstante aquí va una forma sencilla que he encontrado en Shell Fu:

for IP in 192.168.1.{1..10}; do if ping $IP -c 1 > /dev/null; then echo $IP alive; else echo $IP dead; fi; done

Y la salida (escaneo desde la 192.168.1.1 a 192.168.1.10

~$ for IP in 192.168.1.{1..10}; do if ping $IP -c 1 > /dev/null; then echo $IP alive; else echo $IP dead; fi; done
192.168.1.1 alive
192.168.1.2 dead
192.168.1.3 dead
192.168.1.4 dead
192.168.1.5 dead
192.168.1.6 dead
192.168.1.7 dead
192.168.1.8 dead
192.168.1.9 dead
192.168.1.10 dead

Chuleta: Atajos de teclado para Shell Bash

Os dejo el enlace a la descarga de una excelente recopilación a modo de chuleta que han realizado en beerpla.net relacionada con atajos de teclados en la Shell Linux Bash, sin duda conociendo estos atajos de teclado incrementarás tu rendimiento y rapidez en la shell por excelencia, Bash:

Tabla de equivalencias entre comandos DOS y UNIX

Esta tabla servirá de referencia a aquellos usuarios que pasen de DOS a UNIX o viceversa:

Tarea ...                         DOS                     UNIX

Listar ficheros dir/w dir ls dir ls -l Mostrar contenido de ficheros type cat Mostrar contenido de ficheros type filename | more more paginando Copiar fichero copy cp Buscar cadena en fichero find grep fgrep Comparar ficheros comp diff Renombrar fichero rename OR ren mv Borrar fichero erase OR del rm Borrar directorio rmdir OR rd rmdir Cambiar permisos de ficheros attrib chmod Crear directorio mkdir o md mkdir Moverse entre directorios chdir OR cd cd Ayuda help man apropos Mostrar fecha y hora date, time date Mostrar espacio disponible chkdsk df Imprimir fichero print lpr Mostrar cola de impresión print lpq

Fuente: DOS to UNIX Translation

Descubre los comandos que más utilizas en la shell

Con la siguiente línea de comandos, descubriras que es lo que más usas en tu shell:

history | awk '{print $2}' | sort | uniq -c | sort -rn | head

La explicación es sencilla:
history -> muestra el historico de comandos ejecutados
awk ‘{print $2}‘ -> filtra y muestra solamente la segunda columna del historico
sort -> ordena el listado
uniq -c -> junta todas las líneas que son iguales
sort -rn ->Ordena de forma numérica e invertida
head -> muestra solamente los 10 primeros resultados.

Simplemente es una curiosidad más ;)