GNU/Linux >> Tutoriales Linux >  >> Linux

Linux Bash Scripting Part5 – Señales y trabajos

En la publicación anterior, hablamos sobre la entrada, la salida y la redirección en los scripts de bash. Hoy aprenderemos cómo ejecutarlos y controlarlos en un sistema Linux. Hasta ahora, solo podemos ejecutar secuencias de comandos desde la interfaz de línea de comandos, pero esta no es la única forma de ejecutar secuencias de comandos bash de Linux.

Esta publicación describe las diferentes formas de controlar sus scripts bash de Linux.

Señales de Linux

Estas son las señales del sistema Linux más comunes:

Número Nombre Trabajo
1 SUSCRIBIR El proceso cuelga.
2 SIGINT Interrupción del Proceso.
3 SIGQUIT El proceso se cierra o se detiene.
9 SIGKILL Terminación del proceso.
15 SIGTERM Terminación del proceso.
17 SIGSTOP Detención del proceso sin terminación.
18 SIGTSTP Detención o pausa del proceso sin terminación.
19 CONT SIGNO Continuación del proceso después de detenerse.

Sus scripts bash de Linux no controlan estas señales. Puede programar su script bash para que reconozca señales y ejecute comandos en función de la señal que se envió.

Detener un proceso

Para detener un proceso en ejecución, puede presionar Ctrl+C, lo que genera una señal SIGINT para detener el proceso actual que se ejecuta en el shell.

$ sleep 100

Ctrl+C

Pausar un proceso

Las teclas Ctrl+Z generan una señal SIGTSTP para detener cualquier proceso que se esté ejecutando en el shell, y eso deja el programa en la memoria.

$ sleep 100

Ctrl+Z

El número entre paréntesis, que es (1), es el número de trabajo.

Si intenta salir del shell y tiene un trabajo detenido asignado a su shell, bash le advierte si lo hace.

Puede usar el comando ps para ver los trabajos detenidos.

ps –l

En la columna S (estado del proceso), muestra los estados trazado (T) o detenido (S).

Si desea finalizar un trabajo detenido, puede eliminar su proceso mediante el comando de eliminación.

kill processID

Señales de trampa

Para atrapar señales, puede usar el comando atrapar . Si el script recibe una señal definida por el comando trap, deja de procesar y, en su lugar, el script maneja la señal.

Puede atrapar señales usando el comando de trampa como este:

#!/bin/bash

trap "echo 'Ctrl-C was trapped'" SIGINT

total=1

while [ $total -le 3 ]; do

	echo "#$total"

	sleep 2

	total=$(($total + 1))

done

Cada vez que presiona Ctrl+C, la señal queda atrapada y el mensaje se imprime.

Si presiona Ctrl+C, la declaración de eco especificada en el comando trap se imprime en lugar de detener el script. Genial, ¿verdad?

Atrapar la salida del script

Puede atrapar la salida del script de shell usando el comando trap como este:

#!/bin/bash

# Add the EXIT signal to trap it

trap "echo Goodbye..." EXIT

total=1

while [ $total -le 3 ]; do

	echo "#$total"

	sleep 2

	total=$(($total + 1))

done

Cuando finaliza el script bash, el mensaje de despedida se imprime como se esperaba.

Además, si sale del script antes de terminar su trabajo, se activará la trampa EXIT.

Modificar o eliminar una trampa

Puede volver a emitir el comando trap con nuevas opciones como esta:

#!/bin/bash

trap "echo 'Ctrl-C is trapped.'" SIGINT

total=1

while [ $total -le 3 ]; do

	echo "Loop #$total"

	sleep 2

	total=$(($total + 1))

done

# Trap the SIGINT

trap "echo ' The trap changed'" SIGINT

total=1

while [ $total -le 3 ]; do

	echo "Second Loop #$total"

	sleep 1

	total=$(($total + 1))

done

Observe cómo el script gestiona la señal después de cambiar la trampa de señal.

También puedes quitar una trampa usando dos guiones.

trap -- SIGNAL
#!/bin/bash

trap "echo 'Ctrl-C is trapped.'" SIGINT

total=1

while [ $total -le 3 ]; do

	echo "#$total"

	sleep 1

	total=$(($total + 1))

done

trap -- SIGINT

echo "I just removed the trap"

total=1

while [ $total -le 3 ]; do

	echo "Loop #2 #$total"

	sleep 2

	total=$(($total + 1))

done

Observe cómo la secuencia de comandos procesa la señal antes de eliminar la trampa y después de eliminar la trampa.

$ ./myscript

Ctrl+C

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

Ejecución de scripts Bash de Linux en segundo plano

Si ve el resultado del comando ps, verá todos los procesos en ejecución en segundo plano y no vinculados a la terminal.

Podemos hacer lo mismo, simplemente coloque el símbolo de y comercial (&) después del comando.

#!/bin/bash

total=1

while [ $total -le 3 ]; do

	sleep 2

	total=$(($total + 1))

done
$ ./myscipt &

Una vez que haya hecho eso, la secuencia de comandos se ejecuta en un proceso en segundo plano separado en el sistema y puede ver la identificación del proceso entre corchetes.

Cuando el script muere, verá un mensaje en el terminal.

Tenga en cuenta que mientras se ejecuta el proceso en segundo plano, puede usar el monitor de su terminal para los mensajes STDOUT y STDERR, por lo que si ocurre un error, verá el mensaje de error y la salida normal.

El proceso en segundo plano se cerrará si sale de su sesión de terminal.

Entonces, ¿qué sucede si desea continuar ejecutándose incluso si cierra la terminal?

Ejecutar scripts sin colgar

Puede ejecutar sus secuencias de comandos bash de Linux en segundo plano, incluso si sale de la sesión de terminal con el comando nohup. .

El comando nohup bloquea cualquier señal SIGHUP. Evita que el proceso finalice cuando sales de tu terminal.

$ nohup ./myscript &

Después de ejecutar el comando nohup, no puede ver ningún resultado o error de su secuencia de comandos. Enviaste los mensajes de salida y de error a un archivo llamado nohup.out .

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

Ver trabajos

Para ver los trabajos actuales, puede usar el comando de trabajos.

#!/bin/bash

total=1

while [ $total -le 3 ]; do

	echo "#$count"

	sleep 5

	total=$(($total + 1))

done

Luego ejecútalo.

$ ./myscript

Luego presione Ctrl+Z para detener el script.

Ejecute el mismo script bash pero en segundo plano usando el símbolo de y comercial y redirija la salida a un archivo solo para aclaración.

$ ./myscript > outfile &

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

jobs –l

-l parámetro para ver el ID del proceso

Reinicio de trabajos detenidos

Puede usar el comando bg para reiniciar un trabajo en segundo plano.

$ ./myscript

Luego presione Ctrl+Z

Ahora está detenido.

$ bg

Después de usar el comando bg, ahora se ejecuta en segundo plano.

Si tiene varios trabajos detenidos, puede hacer lo mismo especificando el número de trabajo en el comando bg.

Puedes usar el comando fg para reiniciar un trabajo en modo de primer plano.

$ fg 1

Programación de un trabajo

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

  • al mando.
  • tabla cron.

El comando

Este es el formato del comando

a las [-f nombre de archivo] hora

El comando at puede aceptar diferentes formatos de hora:

  • Formato de hora estándar como 10:15.
  • Un indicador AM/PM como 11:15 PM.
  • Un tiempo con nombre como ahora, medianoche.

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

  • Un formato de fecha estándar, como MMDDAA o DD.MM.AA.
  • 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 mañana.
  • 11:15 + 7 días.

No queremos profundizar en el comando at, pero por ahora, hágalo simple.

$ at -f ./myscript now

Puede usar el parámetro -M para enviar la salida a un 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, use el comando atq:

Eliminar trabajos pendientes

Para eliminar un trabajo pendiente, use el comando atrm:

$ atrm 18

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

Programación de guiones

¿Qué sucede si necesita ejecutar un script a la misma hora todos los días o todos los meses?

Puede usar el comando crontab para programar trabajos.

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

$ crontab –l

El formato para crontab es:

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

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

30 10 * * * comando

El carácter comodín (*) utilizado para indicar que el cron ejecutará el comando diariamente todos los meses a las 10:30.

Para ejecutar un comando a las 5:30 p. m. 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 del 1 al 31.

Mantengámoslo simple por ahora, y discutiremos el cron en gran detalle en publicaciones futuras.

Para editar la tabla cron, use el parámetro -e así:

crontab –e

Luego escriba su 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, ve un error que dice que el recurso no está disponible temporalmente.

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!

Puede usar uno de los directorios de secuencias de comandos cron preconfigurados como:

/etc/cron.hourly

/etc/cron.daily

/etc/cron.weekly

/etc/cron.monthly

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

Inicio de secuencias de comandos al iniciar sesión

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

$HOME/.bash_profile

$INICIO/.bash_login

$HOME/.perfil

Para ejecutar sus scripts al iniciar sesión, coloque su código en

$HOME/.bash_profile

.

Inicio de secuencias de comandos al abrir el shell

Bien, ¿qué hay de ejecutar nuestro script bash cuando se abre el shell? Fácil.

Escribe tu script en

 .bashrc

archivo.

Y ahora, si abre la ventana de shell, ejecutará ese comando.

Espero que encuentres útil la publicación. Sigue regresando.

Gracias.


Linux
  1. Comunicación entre procesos en Linux:sockets y señales

  2. Cómo encontrar y matar el proceso Zombie en Linux

  3. Scripts de Linux:3 procedimientos para bucles while en Bash

  4. terminación de procesos mmap, msync y linux

  5. Linux:ver y eliminar procesos repudiados

Cómo usar el comando de fecha en Bash Scripting en Linux

Cron Jobs y Crontab en Linux explicados

Linux Bash Scripting Part5 – Señales y trabajos

Cómo borrar el historial de Bash en Linux y Mac

Bash Scripting:cómo generar y formatear texto en Linux Shell

Cómo rastrear y rastrear un proceso de Linux