Linux en Español

Scripting de Bash en Linux Parte5- Señales y Trabajos

En la publicación anterior, hablamos acerca de la entrada, salida y redirección en scripting de bash de Linux. Hoy aprenderemos como ejecutar y controlarlos en un sistema Linux. Hasta ahora ejecutamos los scripts solo desde la línea de comandos. Pero esta no es la única manera de hacerlo.

Esta publicación describe diferentes maneras de controlar tus scripts de bash de Linux.


 

Señales de Linux

Las señales del sistema más comunes de sistemas Linux son las siguientes:

Num        Nombre                    Trabajo

1              SIGHUP              Cuelga el proceso.

2             SIGINT                Interrupción de un proceso.

3             SIGQUIT              El proceso sale o se detiene.

9             SIGKILL              Terminación del proceso.

15           SIGTERM            Terminación del proceso.

17           SIGSTOP              El proceso se detiene sin terminar.

18           SIGTSTP              El proceso se detiene o se pausa sin terminar.

19           SIGCONT            El proceso continúa después de terminar.

Tus scripts de bash de Linux no controlan estas señales, pero puedes programar tu script de bash para que reconozca las señales y realice comandos de acuerdo con la señal que fue enviada.

 


Detener un Proceso

Para detener un proceso en ejecución, puede presionar Ctrl+C, lo cual generará una señal SIGINT que detendrá que detendrá el proceso en ejecución dentro del shell.

$ sleep 100

Ctrl+C

Linux señales y trabajos

Pausar un proceso

Las teclas Ctrl+Z generan la señal SIGTSTP que detiene cualquier proceso ejecutándose en el shell, dejando el programa en memoria.

$ sleep 100

Ctrl+Z

proceso de pausa

El numero entre los paréntesis el cual es (1) es el número de trabajo.

Si intentas salir del shell y detienes un trabajo asignado a este, el bash te advertirá que el trabajo existe.

El comando ps es utilizado para ver los trabajos detenidos.

ps l

ps -l

En la columna S (estados del proceso), se muestra los estados en seguimiento (T) o detenidos (S).

Si quieres terminar un trabajo detenido, puedes matar el proceso utilizando el comando Kill.

kill processID

 


Atrapar Señales

Para atrapar señales, puedes utilizar el comando trap. Si el script obtiene una señal definida por el comando trap, detiene el procesamiento y en su lugar el script maneja la señal.

Puedes atrapar señales utilizando el comando trap de la siguiente manera:


Cada vez que presionas Ctrl+C, la señal del mensaje es atrapada y el mensaje es impreso.

Atrapar señales

Si presionas Ctrl+C, la sentencia echo especificada en el comando trap es impresa en lugar de detener el script. ¿Genial, cierto?

 


Atrapando la Terminación del Script

Para atrapar la terminación del script de shell utiliza el comando trap de la siguiente forma:


Atrapando la terminación del script

Cuando el script de bash termina, el mensaje de despedida se imprime como es esperado.

Además, si terminas el script antes de finalizar su trabajo, la trampa EXIT será activada.

 

Modificando o Removiendo una Trampa

Puedes reformular el comando trap con nuevas opciones como esta:


Modificando o removiendo una trampa

Observa como el script administra la señal antes de cambiar la señal de trampa.

También puedes eliminar una trampa usando la trampa de 2 guiones trap -- SIGNAL


Observa cómo el script procesa la señal antes de quitar la trampa y después de quitar la trampa.

$ ./myscript

Crtl+C

 quitar la trampa

El primer Ctrl + C quedó atrapado y el script continúa ejecutándose mientras que el segundo sale del script porque se eliminó la trampa.

 

Ejecutar scripts Bash de Linux en segundo plano

Si observas el resultado del comando ps, verás todos los procesos en ejecución en segundo plano y que no están vinculados al terminal.

Podemos hacer lo mismo, simplemente coloca el símbolo de ampersand (&) después del comando.


$ ./myscipt &

ejecutar en segundo plano

Una vez que hayas hecho esto, la secuencia de comandos se ejecutara en un proceso en segundo plano en el sistema y puede ver la identificación del proceso entre los corchetes.

Luego, cuando el script muere, vas a ver un mensaje en la terminal.

Ten en cuenta que mientras se está ejecutando el proceso en segundo plano, puedes utilizar tu monitor de terminal para revisar los mensajes STDOUT y STDERR de modo que, si ocurre un error, puedas ver el mensaje de error y la salida normal.

ejecutar script en segundo plano

El proceso de fondo se cerrará si sales de tu sesión de terminal.

Entonces, ¿qué sucede si deseas que continúe ejecutándose incluso si cierras la terminal?

 


Ejecución de scripts sin colgar

Puede ejecutar tus scripts de bash de Linux en un proceso en segundo plano incluso si sales de la sesión de la terminal utilizando el comando nohup.

El comando nohup bloquea cualquier señal SIGHUP. Esto evita que el proceso salga cuando sales de tu sesión de terminal.

$ nohup ./myscript &

Ejecución de scripts sin colgar

Después de ejecutar el comando nohup, no puedes ver ningún resultado o error de su secuencia de comandos. Los mensajes de salida y error se envían a un archivo llamado nohup.out.

Nota: cuando se ejecutan varios comandos desde el mismo directorio se anulará el contenido del archivo nohup.out.

 

Viendo trabajos

Para ver los trabajos actuales, puedes utilizar el comando jobs.


Luego ejecútalo.

$ ./myscript

A continuación, presiona Ctrl + Z para detener el script.

Viendo trabajos

Ejecuta el mismo script de bash, pero en segundo plano usando el símbolo ampersand y redirige el resultado a un archivo solo para aclararlo.

$ ./myscript > outfile &

lista de trabajos

El comando de jobs muestra los trabajos detenidos y en ejecución.

jobs l

-l parámetro para ver el ID del proceso

 

Reiniciar trabajos detenidos

El comando bg se usa para reiniciar un trabajo en modo de segundo plano.

$ ./myscript

A continuación, presiona Ctrl + Z

Ahora está detenido.

$ bg

Reiniciar trabajos detenidos

Después de utilizar el comando bg, ahora se está ejecutando en modo de segundo plano.

Si tienes múltiples trabajos detenidos, puedes hacer lo mismo especificando el número de trabajo en el comando bg.

El comando fg se usa para volver a colocar un trabajo en modo de primer plano.

$ fg 1

 


Programando un trabajo

El sistema Linux proporciona 2 formas de ejecutar un script de bash en un momento predefinido:

  • El comando at.
  • cron table.

El comando at

Este es el formato del comando

at [-f filename] time

El comando at puede aceptar diferentes formatos de tiempo:

  • Formato de hora estándar como 10:15.
  • Un indicador AM / PM como las 11:15 PM.
  • Un tiempo específicamente nombrado como ahora, medianoche.

Puede incluir una fecha específica, utilizando algunos formatos de fecha diferentes:

  • Un formato de fecha estándar, como MMDDYY o DD.MM.YY.
  • Una fecha de texto, como el 10 de junio o el 12 de febrero, con o sin el año.
  • Ahora + 25 minutos.
  • 05:15 a.m. mañana.
  • 11:15 + 7 días..

No queremos profundizar en el comando at, pero por ahora, simplemente mantenlo simple.

$ at -f ./myscript now

comando at

El parámetro -M se utiliza para enviar la salida al correo electrónico si el sistema tiene correo electrónico, y si no, esto suprimirá la salida del comando at.

Para enumerar los trabajos pendientes, utiliza el comando atq:

cola at

 

Eliminar trabajos pendientes

Para eliminar un trabajo pendiente, usa el comando atrm:

$ atrm 18

Eliminar trabajos pendientes

Debe especificar el número de trabajo para el comando atrm.

 

Programación de scripts

¿Qué sucede si necesita ejecutar un script a la misma hora todos los días o cada mes más o menos?

Puedes usar el comando crontab para programar trabajos.

Para enumerar los trabajos programados, use el parámetro -l:

$ crontab l

El formato para crontab es:

minuto, hora, día de mes, mes y día de la semana

Entonces, si desea ejecutar un comando diariamente a las 10:30, escriba lo siguiente:

Comando 30 10 * * *

El carácter comodín (*) se usa para indicar que el cron ejecutará el comando todos los días a las 10:30.

Para ejecutar un comando a las 5:30 PM todos los martes, usaría lo siguiente:

30 17 * * 2 comando

El día de la semana comienza de 0 a 6, donde domingo = 0 y sábado = 6.

Para ejecutar un comando a las 10:00 al comienzo de cada mes:

00 10 1 * * comando

El día del mes es de 1 a 31.

Vamos a mantenerlo simple por ahora y discutiremos el cron en gran detalle en publicaciones futuras.

Para editar la tabla cron, usa el parámetro -e de esta manera::

crontab e

Luego escribe un comando como el siguiente:

 30 10 * * * /home/likegeeks/Desktop/myscript

Esto programará nuestro script para que se ejecute a las 10:30 todos los días.

Nota: a veces puedes ver que el error dice Recurso temporalmente no disponible.

Todo lo que tienes que hacer es esto:

$ rm -f /var/run/crond.pid

Debes ser un usuario root para hacer esto.

¡Así de simple!

Puedes usar uno de los directorios de scripts cron pre configurados como:

/etc/cron.hourly

/etc/cron.daily

/etc/cron.weekly

/etc/cron.monthly

Simplemente coloca tu archivo de script de bash en cualquiera de estos directorios y se ejecutará periódicamente.

Inicio de scripts al iniciar sesión

En las publicaciones anteriores, hemos hablado sobre los archivos de inicio, te recomiendo que revises el anterior.

$HOME/.bash_profile

$HOME/.bash_login

$HOME/profile

Para ejecutar sus scripts al iniciar sesión, coloca tu código en $HOME/.bash_profile.

Inicio de scripts al abrir el shell

OK, ¿Ahora cómo podemos ejecutar nuestro script de bash cuando se abre el shell? Fácil.

Escribe tu script en el archivo  .bashrc file.

Y si abres la ventana se ejecutará un comando. Espero que hayas encontrado espero que esta publicación te haya sido útil, vuelve pronto.

Gracias.

Mokhtar Ebrahim
Estoy trabajando como administrador de sistemas Linux desde 2010. Soy responsable de mantener, proteger y solucionar problemas de servidores Linux para múltiples clientes de todo el mundo. Me encanta escribir guiones de shell y Python para automatizar mi trabajo.

Deja un comentario

Tu dirección de correo electrónico no será publicada. Los campos obligatorios están marcados con *