Evitar que F10 despliegue el menú en Terminal de Ubuntu

Utilizando la aplicación Terminal de Ubuntu para acceder a una consola, al presionar la tecla la tecla F10 se despliega el menú superior. Esta tecla es utilizada para salir de múltiples herramientas de línea de comandos, como por ejemplo ‘mc’.

Para evitar este comportamiento, en la misma aplicación Terminal

  1. Acceder al menú Edit > Preferences
  2. Seleccionar el apartado «General»
  3. Desmarcar «Enable the accelerator key (F10 by default)»

Basado en:

https://askubuntu.com/questions/1035961/ubuntu-18-04-terminal-f10-function-key-conflict-with-htop

Cambiar la prioridad de los procesos en Linux

Si bien es posible lanzar procesos indicando la prioridad en Linux, existen casos en los que necesitamos cambiar la prioridad de un proceso en ejecución. Para eso existe el comando renice.

renice [-n] <niceness> [-p|-g|-u] <identificadores>

donde identificadores se corresponde con:

  • un conjunto de ids de proceso (pid) si no se especifica parámetro o se precede por -p
  • un conjunto de id de grupo de proceso si se precede por -g
  • un conjunto de usuarios si se precede por -u.

Los usuarios que no sean el superusuario sólo pueden bajar la prioridad de sus procesos, es decir, aumentar su niceness (en el rango de 0 a 19). El superusuario (root) puede ajustar la prioridad de cualquier proceso usando un valor nice del rango completo (-20 a 19).

Ejemplo

Suponiendo que se está importando una base de datos y este proceso está consumiendo mucha CPU, obtenemos su PID (process id) mediante top o pgrep, y le bajamos la prioridad ejecutando desde la consola

$ renice +5 2119
2119 (process ID) old priority 0, new priority 5

Podemos repetir la operación, si la prioridad establecida no fuera suficientemente baja:

$ renice +7 2119
2119 (process ID) old priority 5, new priority 7

De esta manera, es posible que el proceso demore un poco más en terminar su ejecución, pero al mismo tiempo, otros tendrán más CPU disponible.


Ahora bien, si después de un rato vemos que no se concretara, podríamos intentar incrementar su prioridad haciendo:

$ renice 0 2119
renice: failed to set priority for 2119 (process ID): Permission denied

Esta acción falla debido a que para bajar el valor nice es necesario ser superusuario:

$ sudo renice 0 2119
2119 (process ID) old priority 10, new priority 0

Solo con el superusuario podemos establecer un niceness < 0:

$ sudo renice -5 2119
2119 (process ID) old priority 0, new priority -5

También te puede interesar:

Cambiar la prioridad de un proceso en Windows

Prioridades en Linux

Cuando ejecutamos un proceso, es el sistema operativo quien determina la planificación y asignación de recursos al mismo, entre ellos, el tiempo de CPU.

Mendiante el comando top podemos ver los procesos en ejecución

 PID USER  PR  NI    VIRT    RES    SHR S %CPU %MEM     TIME+ COMMAND
 838 us1   20   0  479476 117116  56872 S  4,7  5,7   1:02.12 Xorg   
1867 us1   20   0 1808172 255376 129456 S  2,0 12,5   0:11.70 firefox
2211 us1   20   0  751108  45624  30484 S  1,7  2,2   0:00.63 gedit  
 627 root  20   0    4552    840    776 S  0,3  0,0   0:00.01 acpid  
2226 us1   20   0   51184   4232   3604 R  0,3  0,2   0:00.13 top    
   1 root  20   0  159892   8956   6528 S  0,0  0,4   0:01.76 systemd

De toda la información presentada nos enfocamos en 2 columnas:

NI (niceness): valor de prioridad vinculado al usuario. El rango del valor nice comprende desde -20 (el mayor) a +19 (el menor).

  • Cuanto más «nice» sea un proceso, más le da lugar a otro proceso para que se ejecute.
  • El incrementar este valor en 1 otorga al proceso un 10% más de tiempo de CPU, aproximadamente.

PR (priority): prioridad del proceso para el kernel de Linux. El rango de prioridades comprende desde  0 a 139, siendo

  • de 0 a 99 para tiempo real (‘rt’ en la salida de top)
  • de 100 a 139 para los usuarios (rango 0 a 39 en la salida de top)

La relación entre ambos es la siguiente:

PR = 20 + NI

Es por ello que el rango de PR = 20 + (-20 a +19) es 0 a 39.

El valor de nice, por defecto, para un proceso es heredado de su padre, y por lo general, es 0 (la prioridad correspondiente es 20). Es posible especificar un valor de nice para cambiar la prioridad de un proceso en ejecución o bien lanzar un proceso con una prioridad diferente.

Basado en:

https://askubuntu.com/questions/656771/process-niceness-vs-priority

https://peteris.rocks/blog/htop/#process-niceness-and-priority

Mostrar caracteres no imprimibles en un archivo de texto

A veces los archivos de texto contienen caracteres no imprimibles o espacios al final de línea que no siempre se notan claramente.

$ cat contenido.txt
texto 1
texto 2
texto   3

Invocando cat con la opción -A podemos verlos:

$ cat -A contenido.txt
texto 1 ^M$
texto 2^M$
texto^I3^M$
^M$

En este ejemplo podemos, se trata de un archivo en formato DOS por el fin de línea utilizado (^M$), en el cual:

  • la primer línea tiene un espacio luego de 1,
  • la tercera tiene un TAB (^I) entre texto y 3
  • la última es una línea vacía

Basado en:

http://systemadmin.es/2015/03/ver-caracteres-no-imprimibles-con-cat

Cambiar de directorio en la línea de comandos en Linux

Continuamente cambiamos de directorio para ubicarnos donde necesitamos trabajar. El comando cd es uno de los más utilizados en la consola.

Una situación particularmente común es cambiar entre un par de directorios, o bien ir a uno temporalmente para volver a donde estábamos ubicados.

Volver al directorio anterior

Para posicionarnos en el directorio donde nos encontrábamos antes del último cambio:

cd -

Ejemplo 1:

$ cd /var/www
$ cd /tmp
$ cd -
/var/www
Quedamos posicionados en /var/www

$ cd -
/tmp
Quedamos posicionados en /tmp

Si seguimos haciendo cd – volveremos a alternar entre ambos directorios.

Guardar directorio actual y poder volver a él

Sin conocer con precisión el directorio al que queremos acceder, es posible que usemos muchas veces cd hasta alcanzarlo. Es posible guardar nuestra ubicación actual para poder volver rápidamente a ella.

$ cd /tmp
$ pushd /var
/var /tmp
Guardamos la posición actual /tmp y quedamos posicionados en /var

$ cd lib
$ cd mysql
$ popd
/tmp
Quedamos posicionados en /tmp

Si en lugar de popd hubiéramos ejecutado cd -, nos habría posicionado en /var/lib.

 

Obs: Cada vez que se ejecuta pushd, se agrega el directorio actual a una pila. Cada vez que se ejecuta popd, se quita el último directorio de esa pila.

Formas de ejecutar comandos en secuencia

Cuando se desea ejecutar una serie de comandos en cierto orden y consecutivamente, es común ingresar uno y según el resultado obtenido ejecutar o no el siguiente.

Para simplificar esta acción hay varias alternativas según lo que deseemos que suceda según el éxito o fallo del anterior:

1. Ejecutar cada comando sin importar el resultado del anterior

Se separan los comandos por ; (punto y coma) y se ejecutan TODOS.

mkdir temp; tar -cvzf temp/app1.tar.gz app1

Se crea el directorio y luego se genera un tar.gz dentro. Si el directorio existe, el primer comando falla pero no importa.

2. Ejecutar cada comando si el anterior fue exitoso

Se separan los comandos por && (operador Y) y se ejecutan hasta que uno falle.

tar -cvzf backup/docs.tar.gz docs_dir && rm -r docs_dir/

Se crea un tar.gz y solo si esta acción es exitosa, se elimina el directorio.

3. Ejecutar cada comando si el anterior falló

Se separan los comandos por || (operador O) y en este caso se detiene en el primer comando que se se ejecute con éxito.

wget http://server1/data.txt || wget http://server1/data.bkp || date >> failed_data.log

Se intenta obtener data.txt, si no es posible, se intenta con data.bkp. Si también falla, en última instancia se agrega a un log la fecha y hora del (doble) intento fallido.

 

Por supuesto, se pueden hacer combinaciones entre los casos:

mkdir check; cd check; wget http://server1/data.txt || wget http://server1/data.bkp && mv data.txt || date >> failed_data.log
  • Se crea el directorio y se lo accede. Si el directorio existe, el primer comando falla pero sigue la ejecución.
  • Se intenta obtener data.txt. Si esta descarga se completa, se detiene la ejecución de comandos.
  • De lo contrario, se intenta obtener data.bkp. Si esta descarga se completa se renombra el archivo a data.txt. Si esta última acción puede realizarse, se detiene la ejecución de comandos.
  • Si no se pudo descargar data.bkp o bien no se lo pudo renombrar, se agrega a un log la fecha y hora del (doble) intento fallido.

 

Importante: en los casos mencionados, un comando no utiliza la salida del anterior como su entrada.

Cómo buscar hacia atrás (y hacia adelante) en el historial de Linux

El historial de la consola puede volverse muy grande y recorrerlo línea por línea cuando recordamos parte del comando ejecutado no vale la pena.

Suponiendo que al ingresar el comando history en la consola obtenemos:

1 cat ~/.bashrc
2 ls -la
3 head ~/.bash_history
4 pwd
5 top
6 tail ~/.bash_history

Para realizar un búsqueda hacia atrás en el historial (Reverse I Search) presionamos Ctrl + R y el prompt cambia a:

(reverse-i-search)`':

A medida que escribimos parte del comando que recordamos, se presentará la línea más reciente del historial que coincida con el texto ingresado.

Por ejemplo, si escribimos «bash» veremos:

(reverse-i-search)`bash': tail ~/.bash_history

  • Al presionar Enter, ejecutamos el comando.
  • Al presionar la tecla de flecha izquierda o derecha, editamos antes de ejecutarlo.

Si volvemos a presionar Ctrl + R, seguiremos buscando coincidencias hacia atrás; en nuestro caso si lo hacemos 2 veces obtendríamos:

(reverse-i-search)`bash': cat ~/.bashrc

 

En caso de que deseemos cambiar el sentido de la búsqueda hacia adelante  (Forward I Search) presionamos Ctrl + S y el prompt cambia a:

(i-search)`bash': cat ~/.bashrc

Si volvemos a presionar Ctrl + S, seguiremos buscando coincidencias hacia adelante; en nuestro caso obtendríamos:

(i-search)`bash': head ~/.bash_history

Desactivar XOFF

Da la casualidad que Ctrl + S por defecto sirve para indicar el carácter de control que pausa la transmisión de datos en la consola (XOFF) – y Ctrl + Q para continuarla (XON).

Para desactivar este comportamiento, desde la consola ejecutamos:

$ stty -ixoff

o bien, podemos agregar esta línea al archivo de configuración de la consola (~/.bashrc) así aplica a las futuras sesiones.

Ejecutar un comando sin que quede en el historial de Linux

Todos los comandos que ejecutamos desde la consola, quedan registrados en el archivo de históricos el cual se encuentra por defecto en ~/.bash_history para cada usuario (en bash).

Podemos saber cuál es la ubicación y nombre de este archivo mediante:

$ echo $HISTFILE

Para consultarlo, por lo general se utiliza:

$ history

y se puede limpiar mediante

$ history -c

Después de esta introducción, vamos a punto. Si solo necesitamos invocar un comando y que no quede registro de su ejecución basta con agregar un espacio en blanco delante del comando.

$ <ESPACIO>comando

Ejemplo:

$  /etc/init.d/mysqld restart

OBS: existe un espacio adicional delante de la primer barra /

 

Detalles internos

En realidad, este comportamiento depende de la variable HISTCONTROL. Podemos ver su valor mediante:

$ echo $HISTCONTROL

Los valores soportados son los siguientes (se pueden indicar varios separados por coma):

  • ignorespace: los comandos ingresados que comiencen con un espacio, no se guardan en el histórico
  • ignoredups: los comandos ingresados que coincidan con la última línea del histórico, no se registran
    • si se ingresa varias veces consecutivas el mismo comando (duplicado), solo queda registrado una vez
  • erasedups: los comandos ingresados que coincidan con alguna línea del histórico, se registran y se borra la línea existente previamente
    • si se ingresa varias veces, consecutivas o no, el mismo comando (duplicado) solo se deja registro de la última vez
  • ignoreboth: es lo mismo que «ignorespace,ignoredups»

Invertir el orden de las líneas de un archivo en Linux

Si necesitamos procesar el contenido de un archivo, tomando sus líneas desde la última a la primera (por ejemplo en un archivo de log) podemos programar un script que las lea todas y luego aplique la acción en el orden requerido. Pero si pudiéramos hacerlo desde la consola sería mejor. Y se puede.

Simplemente utilizamos el comando tac (el inverso de cat) el cual concatena cada archivo que se pasa como argumento pero en el orden inverso, línea por línea desde el final del archivo.

Ejemplo:

tac original.log > invertido.log

crea el archivo invertido.log con las líneas en el orden opuesto al que poseen en original.log

 

Tip: No confudamos con tail, el cual imprime las últimas líneas de un archivo pero en el orden original.

Repetir el comando previo con ajustes en Linux

Si bien podemos utilizar la flecha hacia arriba del teclado para mostrar el comando ejecutado previamente en la consola, existe la posibilidad de usar el doble signo de admiración:

$ !!

Esta forma es más conveniente cuando queremos agregar algo antes o después del comando ejecutado.

Ejemplo 1:

$ chown www-data:www-data www
chown: cambiando el propietario de «www»: Operación no permitida

Queremos cambiar el dueño y grupo del directorio www, pero no tenemos permiso

$ sudo !!
sudo chown www-data:www-data www
[sudo] password for user:

Una vez que escribamos el password del usuario, la acción se habrá realizado.

Ejemplo 2:

$ crontab -l

Muestra todo el contenido del archivo crontab del usuario logueado en la consola

$ !! > crontab.txt

Generamos un archivo con todo el contenido de dicho crontab.