Señales y trampas en Unix/Linux
Señal es una señal de interrupción de software enviada a un programa para indicar que ha ocurrido un evento crítico. Estos eventos pueden ser muy diversos, desde solicitudes de usuarios hasta accesos ilegales a la memoria. Algunas señales, como las interrupciones de señal, indican que el usuario le ha pedido al programa que haga algo fuera de control.
La siguiente tabla enumera las señales comunes que puede encontrar o desea utilizar en su programa:
señal nombre señal señal número describir SIGHUP 1 Retrasa la verificación del control del terminal o detiene el control del proceso. SIGINT 2 informa al usuario si debe enviar una señal de interrupción (Ctrl + C). SIGQUIT 3 Informa al usuario si debe enviar una señal de salida (Ctrl + D). SIGFPE 8 Si se intenta realizar una actividad matemática ilegal, se le notificará. SIGKILL 9 Si un proceso recibe esta señal, debe salir inmediatamente sin limpiar. SIGALRM 14 Número de señales de señal (alarma). SIGTERM 15 Señal de fin de software (enviada por sigkill por defecto).
Lista de señales en Unix/Linux
Hay una manera fácil de enumerar todas las señales admitidas por el sistema. Solo házmelo saber matar -l comando, mostrará todos los compatibles Señal .
$ kill - l 1 ) SIGHUP 2 ) SIGINT 3 ) SIGQUIT 4 ) SIGILL 5 ) SIGTRAP 6 ) SIGABRT 7 ) SIGBUS 8 ) SIGFPE 9 ) SIGKILL 10 ) SIGUSR1 11 ) SIGSEGV 12 ) SIGUSR2 13 ) SIGPIPE 14 ) SIGALRM 15 ) SIGTERM 16 ) SIGSTKFLT 17 ) SIGCHLD 18 ) SIGCONT 19 ) SIGSTOP 20 ) SIGTSTP 21 ) SIGTTIN 22 ) SIGTTOU 23 ) SIGURG 24 ) SIGXCPU 25 ) SIGXFSZ 26 ) SIGVTALRM 27 ) SIGPROF 28 ) SIGWINCH 29 ) SIGIO 30 ) SIGPWR 31 ) SIGSYS 34 ) SIGRWR 31 ) SIGSYS 34 ) SIGRTMIN 35 ) SIGRTMIN + 1 36 ) SIGRTMIN + 2 37 ) SIGRTMIN + 3 38 ) SIGRTMIN + 4 39 ) SIGRTMIN + 5 40 ) SIGRTMIN + 6 41 ) SIGRTMIN + 7 42 ) SIGRTMIN + 8 43 ) SIGRTMIN + 9 44 ) SIGRTMIN + 9 44 ) SIGRTMIN + 10 45) SIGRTMIN + 11 46) SIGRTMIN + 12 47) SIGRTMIN + 13 48) SIGRTMIN + 14 49) SIGRTMIN + 15 50) SIGRTMAX - 14 51) SIGRTMAX - 13 52) SIGRTMAX - 12 53) SIGRTMAX - 11 54) SIGRTMAX - 10 55 ) SIGRTMAX - 9 56 ) SIGRTMAX - 8 57 ) SIGRTMAX - 7 58 ) SIGRTMAX - 6 59 ) SIGRTMAX - 5 60 ) SIGRTMAX - 4 61 ) SIGRTMAX - 3 62 ) SIGRTMAX - 2 63 ) SIGRTMAX - 1 64 ) SIGRTMAX - 1 64 ) SIGRTMAX - 1 64 ) SIGRTMAX - 1 64 ) SIGRTMAX - 6 64 ) SIGRTMAX - 1 64 ) SIGRTMAX - 1 64 ) SIGRTMAX - 6 64 ) SIGRTMAX - 1 64 ) SIGRTMAX - 6 64 ) SIGRTMAX - 6 64 ) SIGRTMAX - 6 64 )
La lista de señales real varía entre Solaris, HP-UX y Linux.
Actividad por defecto en Unix/Linux
Cada señal tiene una acción predeterminada asociada a ella. Acción predeterminada con Señal Esta es la acción que realiza un script o programa cuando recibe una señal.
Una de las acciones predeterminadas puede ser:
final del proceso
omisión de señal
Volcar la memoria principal, crea un archivo llamado kernel, que contiene la imagen de la memoria del proceso cuando recibe una señal
detener el proceso
continuar el proceso para detener
Enviar alertas en Unix/Linux
Hay varias formas de enviar alertas a un programa o script. Uno de los métodos más comunes es que el usuario presione Ctrl + C o la tecla de detener mientras se ejecuta el script.
cuando presionas Teclas Ctrl + C , SIGINT se envía al script y cuando cada acción especificada completa el script.
Otra forma común de enviar una señal es usar equipo asesino Tiene la siguiente sintaxis:
$ kill - signal pid
Aquí señal es el número o nombre de la señal que se va a enviar, y pid es el identificador del proceso al que se va a enviar la señal. Por ejemplo:
$ kill - 1 1001
Envíe un HUP o una señal al programa con el ID de proceso 1001. Para enviar una señal de eliminación al mismo proceso, use el siguiente comando:
$ kill - 9 1001
Cancelará el proceso actual con ID de proceso 1001.
Captura de señales en Unix/Linux
cuando presionas Control + C O al presionar la tecla detener en la terminal mientras el programa se está ejecutando, el programa generalmente finaliza de inmediato y vuelve a aparecer la línea de comando. Puede que no siempre estés interesado en esto. Por ejemplo, es posible que se quede con un montón de archivos temporales sin limpiar.
señal trampa Sencillamente, la sintaxis del comando trap es la siguiente:
$ trap commands signals
esta aquí, Pedido Puede ser cualquier comando Unix válido, incluso una función definida por el usuario, y las alertas pueden ser una lista de alertas que desea capturar.
Hay 3 usos comunes de las trampas en los scripts de shell:
- limpiar los archivos temporales
- omisión de señal
Limpiar archivos temporales en Unix / Linux
Como ejemplo de un comando trap, así es como puede eliminar algunos archivos y salir si alguien intenta desinstalar el programa de la terminal.
$ trap "rm -f $ WORKDIR / work1 $$ $ WORKDIR / dataout $$; exit" 2
Desde el punto del programa shell donde se ejecuta la trampa, si el programa recibe la señal número 2, los archivos work1 $$ y dataout $$ se eliminarán automáticamente.
Entonces, si el usuario interrumpe el programa después de iniciar esta trampa, puede estar seguro de que ambos archivos se borrarán. El comando exit, seguido de rm, es obligatorio, porque sin él, el programa continuará donde lo dejó cuando se le indicó.
La señal 1 se creó con un retraso: alguien cerró a propósito o la línea se interrumpió aleatoriamente.
En este caso, primero puede editar la captura para eliminar los dos archivos especificados agregando la señal número 1 a la lista de señales.
$ trap "rm $ WORKDIR / work1 $$ $ WORKDIR / dataout $$; exit" 1 2
Estos archivos ahora se eliminarán si la línea está en pausa o si se presionan las teclas Ctrl + C.
Si un comando definido como trampa contiene más de un comando, debe estar entre comillas. También notó que el shell de la línea de comando escanea cuando se ejecuta el comando trap y nuevamente cuando recibe una de las señales enumeradas.
Entonces, en el ejemplo anterior, los valores de WORKDIR y $$ cambiarán cuando comience la trampa. Si desea que este cambio ocurra cuando se reciba la señal número 1 o 2, puede incluir la descripción entre comillas como esta:
$ trap 'rm $ WORKDIR / work1 $$ $ WORKDIR / dataout $$; exit ' 1 2
Ignorar señales en Unix/Linux
Si el comando especificado para la trampa está vacío, la señal especificada se ignorará al recibirla. Por ejemplo, el siguiente equipo:
$ trap '' 2
Recuerde ignorar las señales de interrupción. Es posible que desee ignorar ciertas señales al hacer algo y no desee desconectarse. Puede identificar muchas alertas ignoradas de la siguiente manera:
$ trap '' 1 2 3 15
Recuerde que el primer parámetro debe especificarse para ignorar la señal, y el anterior no se equilibra con el siguiente, pero este último tiene su propio significado:
$ trap 2
Si ignora una señal, todos los proyectiles adicionales también ignorarán esta señal. Sin embargo, si especifica una acción a realizar cuando se recibe una señal, todos los guiones bajos continuarán realizando esa acción cuando se reciba una señal.
Restablecer trampas en Unix / Linux
Después de cambiar la acción predeterminada al recibir una señal, puede volver a cambiarla usando trampa si simplemente ignora el primer parámetro de la siguiente manera:
$ trap 1 2
Restablece la acción realizada al recibir la señal número 1 o 2 al modo predeterminado.
Según el punto de entrenamiento
Anterior: Inicio de sesión en el sistema Unix / Linux
Siguiente: Comandos útiles en Unix/Linux
Deja una respuesta