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:
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.