Menú
gratis
Registro
Hogar  /  firmware/ Cómo ejecutar un programa en Linux. Procesos y gestión de trabajos en segundo plano Linux

Cómo ejecutar un programa en Linux. Procesos y gestión de trabajos en segundo plano Linux

El servicio de terminal de Linux se ejecuta en modo de tarea única de forma predeterminada. Esto significa que cualquier tripulación lanzada bloquea la terminal hasta que esté completa. Este enfoque no es conveniente cuando se ejecutan programas que requieren un tiempo de ejecución prolongado. Este problema se puede resolver de dos maneras: abrir una ventana de terminal adicional y ejecutar otro comando en ella, o usar el modo en segundo plano. Todos los sistemas operativos actuales, incluido Linux, son multitarea, lo que significa la capacidad de ejecutar múltiples programas simultáneamente.

¿Cómo puedo ejecutar una brigada en segundo plano para poder acceder inmediatamente a la interfaz de línea de comandos? Un equipo que se ha visto obligado a ejecutarse se denomina proceso en segundo plano. Los procesos en segundo plano no se muestran en la pantalla. Por ejemplo, el servidor Apache HTTPD se ejecuta en segundo plano para servir páginas web. Puede poner un script de shell o cualquier comando en modo de baja prioridad. Una tarea (por ejemplo, un equipo o un script) se puede poner en segundo plano agregando un "&" al final de la línea de comando. Esta declaración pone el comando en segundo plano y libera espacio en la terminal. Un equipo que se ejecuta en segundo plano se llama trabajo. Mientras se ejecuta el comando en segundo plano, es posible ejecutar cualquier otro comando. La sintaxis es la siguiente:

comando & nombre-script-& /ruta/al/comando arg1 arg2 & comando-1 | comando-2 arg1 y comando-1 | comando-2 -arg1 -arg2 >/ruta/a/salida &

Para ejecutar programas en segundo plano sin bloquear la ventana del terminal, debe utilizar el instructor especial "&". Coloque este carácter al final de la línea después de especificar el nombre del comando, las opciones y los parámetros de entrada. En general, esta secuencia se puede escribir como “nombre_comando -opción parámetro_entrada &”.

ls ~/* > ~/test-file.txt &
18960

Después de presionar el botón Enter, el programa se iniciará automáticamente en segundo plano. En este caso, la terminal mostrará una línea con el siguiente contenido “[número_tarea] identificador_proceso” y le pedirá que ingrese un comando recién creado.

Encuentre comandos que se ejecutan en segundo plano en Linux

Ejecute el siguiente comando:

Ejemplo de salida de datos:

Ejecutando buscar / -iname "*.c" 2> /dev/null > /tmp/output.txt &
+ Ejecutando grep -R "hostNamed" / 2> /dev/null > /tmp/grep.txt &

¿Dónde están los identificadores de pedido?

Para mostrar los ID de proceso para los ID de trabajo además de las conversiones estándar, pase la opción -l:

Ejemplo de salida de datos:

7307 Ejecutando buscar / -iname "*.c" 2> /dev/null > /tmp/output.txt &
+ 7324 Ejecutando grep -R "hostNamed" / 2> /dev/null > /tmp/grep.txt &

Para mostrar solo los ID de proceso, ingrese:

Ejemplo de salida de datos:

Dejar de ejecutar comandos que se ejecutan en segundo plano

Para finalizar un proceso de forma forzada o elegante, utilice el comando kill. La sintaxis es la siguiente:

matar PID
matar -15 PID
matar -9 PID
proceso killall-Nombre-Aquí
Killall -15 proceso-Nombre-Aquí
Killall -9 proceso-Nombre-Aquí

Devolver un programa al modo de primer plano en Linux

Linux le permite no sólo ejecutar programas en segundo plano, sino también devolverlos a la ejecución normal si lo desea. Hay dos herramientas para esto: el comando ( Un equipo es un grupo de personas unidas por motivos e intereses comunes.) fg y el operador %. El principio de su esfuerzo es extremadamente simple. fg requiere especificar el número de trabajo como parámetro y debe sustituirse por % inmediatamente después del operador sin espacios.

buscar / -name .ini 2> ~/results.txt &
19090
fg 1
bash: fg: tarea finalizada
+ Salir 1 buscar / -name .ini 2> ~/results.txt

La última vez hablamos sobre cómo trabajar con flujos de entrada, salida y errores en scripts bash, sobre descriptores de archivos y sobre la redirección de flujos. Ahora ya sabes lo suficiente como para escribir algo propio. En esta etapa de dominar bash, es posible que tenga preguntas sobre cómo administrar los scripts en ejecución y cómo automatizar su lanzamiento.

Hasta ahora, escribimos los nombres de los scripts en la línea de comando y presionamos Enter, lo que provocó que los programas se ejecutaran inmediatamente, pero esa no es la única forma de invocar scripts. Hoy hablaremos sobre cómo un script puede funcionar con señales de Linux, sobre diferentes enfoques para ejecutar scripts y administrarlos durante la ejecución.

Señales de Linux

En Linux, hay más de tres docenas de señales generadas por el sistema o las aplicaciones. Aquí hay una lista de los más utilizados que seguramente serán útiles al desarrollar scripts de línea de comandos.
código de señal
Nombre
Descripción
1
Suspiro
Cerrando la terminal
2
FIRMA
Señal de parada del proceso por parte del usuario desde el terminal (CTRL+C)
3
SIGQUITAR
Señal para detener un proceso por parte del usuario desde la terminal (CTRL+\) con un volcado de memoria
9
SIGKILL
Terminación incondicional del proceso.
15
SIGNO
Señal de solicitud de terminación del proceso
17
SIGSTOP
Forzar la suspensión de un proceso pero no su terminación
18
SIGTSTP
Pausar un proceso desde la terminal (CTRL+Z) pero no cerrar
19
SEÑAL CONT
Continuar la ejecución de un proceso previamente detenido

Si el shell bash recibe una señal SIGHUP cuando cierra el terminal, sale. Antes de salir, envía una señal SIGHUP a todos los procesos que se ejecutan en él, incluidos los scripts en ejecución.

La señal SIGINT hace que la operación se detenga temporalmente. El kernel de Linux deja de asignar tiempo de procesador al shell. Cuando esto sucede, el shell notifica a los procesos enviándoles una señal SIGINT.

Los scripts Bash no controlan estas señales, pero pueden reconocerlas y ejecutar ciertos comandos para preparar el script para las consecuencias causadas por las señales.

Envío de señales a scripts

El shell bash le permite enviar señales a scripts mediante atajos de teclado. Esto resulta muy útil si necesita detener temporalmente un script en ejecución o finalizar su operación.

Terminar un proceso

La combinación de teclas CTRL + C genera una señal SIGINT y la envía a todos los procesos que se ejecutan en el shell, provocando que finalicen.

Ejecutemos el siguiente comando en el shell:

$dormir 100
Después de eso, completaremos su trabajo con la combinación de teclas CTRL + C.


Terminar un proceso desde el teclado

Detener temporalmente el proceso

La combinación de teclas CTRL + Z genera la señal SIGTSTP, que suspende el proceso pero no lo finaliza. Tal proceso permanece en la memoria y se puede reanudar su trabajo. Ejecutemos el comando en el shell:

$dormir 100
Y detenlo temporalmente con la combinación de teclas CTRL + Z.


Pausar el proceso

El número entre corchetes es el número de trabajo que el shell asigna al proceso. El shell trata los procesos que se ejecutan dentro de él como trabajos con números únicos. Al primer proceso se le asigna el número 1, al segundo el 2, y así sucesivamente.

Si pausa un trabajo vinculado a un shell e intenta salir de él, bash emitirá una advertencia.

Puede ver los trabajos suspendidos con el siguiente comando:

Sal –l


Lista de tareas

En la columna S, que muestra el estado del proceso, se muestra T para los procesos suspendidos. Esto indica que el comando está suspendido o en estado de seguimiento.

Si necesita finalizar un proceso suspendido, puede utilizar el comando kill. Puedes leer detalles al respecto.

Su llamada se ve así:

Matar ID de proceso

Intercepción de señal

Para habilitar el seguimiento de señales de Linux en un script, utilice el comando trap. Si el script recibe la señal especificada al llamar a este comando, la procesa de forma independiente, mientras que el shell no procesará dicha señal.

El comando trap permite que el script responda a señales que de otro modo serían procesadas por el shell sin su intervención.

Veamos un ejemplo que muestra cómo el comando trap especifica el código a ejecutar y una lista de señales, separadas por espacios, que queremos interceptar. En este caso es sólo una señal:

#!/bin/bash trap "echo " Ctrl-C atrapado"" SIGINT echo Este es un script de prueba count=1 while [ $count -le 10 ] do echo "Loop #$count" sleep 1 count=$(($ contar + 1)) hecho
El comando trap utilizado en este ejemplo imprime un mensaje de texto cada vez que encuentra una señal SIGINT, que se puede generar presionando Ctrl + C en el teclado.


Intercepción de señal

Cada vez que presiona CTRL + C, el script ejecuta el comando echo especificado al llamar a trace en lugar de permitir que el shell lo finalice.

Puede interceptar la señal de salida del script utilizando el nombre de la señal de SALIDA al llamar al comando trap:

#!/bin/bash trap "echo Adiós..." EXIT count=1 while [ $count -le 5 ] do echo "Loop #$count" sleep 1 count=$(($count + 1)) hecho


Interceptando la señal de salida del script

Cuando el script sale, ya sea normalmente o debido a una señal SIGINT, el shell interceptará y ejecutará el comando echo.

Modificación de señales interceptadas y cancelación de interceptación.

Para modificar las señales interceptadas por el script, puede ejecutar el comando trap con nuevos parámetros:

#!/bin/bash trap "echo "Ctrl-C está atrapado."" SIGINT count=1 while [ $count -le 5 ] do echo "Loop #$count" sleep 1 count=$(($count + 1) ) done trap "echo "¡Modifiqué la trampa!"" SIGINT count=1 while [ $count -le 5 ] do echo "Segundo bucle #$count" sleep 1 count=$(($count + 1)) done


Modificación de interceptación de señales.

Después de la modificación, las señales se procesarán de una manera nueva.

La interceptación de señales también se puede cancelar simplemente ejecutando el comando trap, pasándole un doble guión y el nombre de la señal:

#!/bin/bash trap "echo "Ctrl-C está atrapado."" SIGINT count=1 while [ $count -le 5 ] do echo "Loop #$count" sleep 1 count=$(($count + 1) ) trampa hecha - SIGINT echo "Acabo de quitar la trampa" cuenta=1 mientras que [ $cuenta -le 5 ] haz eco "Segundo bucle #$cuenta" dormir 1 cuenta=$(($cuenta + 1)) hecho
Si el script recibe una señal antes de que se cancele la captura, la procesará como se especifica en el comando de captura actual. Ejecutemos el script:

$ ./miscript
Y presione CTRL + C en el teclado.


Señal interceptada antes de que se cancelara la interceptación.

La primera pulsación de CTRL + C se produjo en el momento de la ejecución del script, cuando la interceptación de la señal estaba vigente, por lo que el script ejecutó el comando de eco asignado a la señal. Después de que la ejecución alcanzó el comando de desenganche, el comando CTRL + C funcionó como de costumbre, finalizando el script.

Ejecutar scripts de línea de comando en segundo plano

A veces, los scripts de bash tardan mucho en completar una tarea. Sin embargo, es posible que necesite poder trabajar normalmente en la línea de comando sin esperar a que se complete el script. No es tan difícil de implementar.

Si ha visto la lista de procesos generados por el comando ps, es posible que haya notado procesos que se ejecutan en segundo plano y no están vinculados a una terminal.
Escribamos el siguiente script:

#!/bin/bash count=1 while [ $count -le 10 ] duerme 1 count=$(($count + 1)) hecho
Ejecutémoslo especificando el carácter comercial (&) después del nombre:

$ ./miscipo &
Esto hará que se ejecute como un proceso en segundo plano.


Ejecutar un script en segundo plano

El script se iniciará en un proceso en segundo plano, su identificador se mostrará en la terminal y, cuando se complete su ejecución, verá un mensaje al respecto.

Tenga en cuenta que aunque el script se ejecuta en segundo plano, continúa usando la terminal para enviar mensajes a STDOUT y STDERR, lo que significa que el texto que genera o los mensajes de error serán visibles en la terminal.


Lista de procesos

Con este enfoque, si sale de la terminal, el script que se ejecuta en segundo plano también saldrá.

¿Qué sucede si desea que el script continúe ejecutándose después de cerrar la terminal?

Ejecutar scripts que no salen al cerrar la terminal

Los scripts se pueden ejecutar en procesos en segundo plano incluso después de salir de la sesión del terminal. Para hacer esto, puedes usar el comando nohup. Este comando le permite ejecutar un programa bloqueando las señales SIGHUP enviadas al proceso. Como resultado, el proceso se ejecutará incluso cuando salga del terminal en el que se inició.

Apliquemos esta técnica al ejecutar nuestro script:

Nohup ./myscript &
Esto es lo que se enviará al terminal.


equipo nohup

El comando nohup libera un proceso de la terminal. Esto significa que el proceso perderá las referencias a STDOUT y STDERR. Para no perder los datos generados por el script, nohup redirige automáticamente los mensajes que llegan a STDOUT y STDERR al archivo nohup.out.

Tenga en cuenta que si ejecuta varios scripts desde el mismo directorio, su salida terminará en un único archivo nohup.out.

Ver tareas

El comando jobs le permite ver los trabajos actuales que se están ejecutando en el shell. Escribamos el siguiente script:

#!/bin/bash count=1 while [ $count -le 10 ] hacer echo "Loop #$count" dormir 10 count=$(($count + 1)) hecho
Ejecutémoslo:

$ ./miscript
Y deténgalo temporalmente con la combinación de teclas CTRL + Z.


Ejecutar y pausar un script

Ejecutemos el mismo script en segundo plano, mientras redirigimos la salida del script a un archivo para que no muestre nada en la pantalla:

$ ./myscript > archivo de salida &
Al ejecutar ahora el comando jobs, veremos información tanto sobre el script suspendido como sobre el que se ejecuta en segundo plano.


Obtener información sobre guiones

El modificador -l al llamar al comando jobs indica que necesitamos información sobre las ID de los procesos.

Reiniciar trabajos suspendidos

Para reiniciar el script en segundo plano, puede utilizar el comando bg.

Ejecutemos el script:

$ ./miscript
Presione CTRL + Z, lo que detendrá temporalmente su ejecución. Ejecutemos el siguiente comando:

$bg


comando bg

El script ahora se ejecuta en segundo plano.

Si tiene varios trabajos suspendidos, puede pasar el número del trabajo al comando bg para reiniciar un trabajo específico.

Para reiniciar el trabajo normalmente, use el comando fg:

Planeando ejecutar scripts

Linux proporciona un par de formas de ejecutar scripts bash en un momento dado. Estos son el comando at y el programador de trabajos cron.

El comando at se ve así:

En el momento [-f nombre de archivo]
Este comando reconoce muchos formatos de hora.

  • Estándar, que indica horas y minutos, por ejemplo: 10:15.
  • Usando indicadores AM/PM, antes o después del mediodía, por ejemplo - 10:15PM.
  • Usando nombres especiales como ahora, mediodía, medianoche.
Además de poder especificar la hora a la que se debe ejecutar un trabajo, al comando at también se le puede pasar una fecha utilizando uno de sus formatos admitidos.
  • Un formato de fecha estándar en el que la fecha se escribe utilizando los patrones MMDDAA, MM/DD/AA o DD.MM.AA.
  • Una representación de texto de la fecha, por ejemplo, 4 de julio o 25 de diciembre, mientras que se puede especificar el año o prescindir de él.
  • Grabando como ahora + 25 minutos.
  • Vista de grabación mañana a las 10:15 p.m.
  • Tipo de grabación 10:15 + 7 días.
No profundicemos en este tema, veamos un caso de uso simple para el comando:

$ en -f ./myscript ahora


Programar trabajos usando el comando at

El modificador -M cuando se llama a se usa para enviar lo que genera el script por correo electrónico si el sistema está configurado para hacerlo. Si no es posible enviar un correo electrónico, esta clave simplemente suprimirá la salida.

Para ver la lista de trabajos en espera de ejecución, puede utilizar el comando atq:


Lista de tareas pendientes

Eliminar trabajos pendientes

El comando atrm le permite eliminar un trabajo pendiente. Al llamarlo, indique el número de tarea:

$ cajero 18


Eliminar un trabajo

Ejecutar scripts según un cronograma

Programar sus scripts para que se ejecuten una vez usando el comando at puede hacer la vida más fácil en muchas situaciones. Pero, ¿qué pasa si necesita que el script se ejecute a la misma hora todos los días, una vez a la semana o una vez al mes?

Linux tiene una utilidad crontab que le permite programar scripts que deben ejecutarse con regularidad.

Crontab se ejecuta en segundo plano y, basándose en los datos de las llamadas tablas cron, ejecuta trabajos según una programación.

Para ver una tabla de trabajos cron existente, use el siguiente comando:

$ crontab –l
Al programar una secuencia de comandos para que se ejecute según una programación, crontab acepta datos sobre cuándo se debe ejecutar el trabajo en el siguiente formato:

Minuto, hora, día del mes, mes, día de la semana.
Por ejemplo, si desea que un determinado script llamado comando se ejecute todos los días a las 10:30, esto corresponderá a la siguiente entrada en la tabla de tareas:

30 10 * * * comando
Aquí, el comodín "*" utilizado para los campos de día del mes, mes y día de la semana indica que cron debe ejecutar el comando todos los días de cada mes a las 10:30 a. m.

Si, por ejemplo, desea que el script se ejecute a las 4:30 p. m. todos los lunes, deberá crear la siguiente entrada en la tabla de tareas:

30 16 * * 1 comando
La numeración de los días de la semana comienza desde 0, 0 significa domingo, 6 significa sábado. Aquí hay otro ejemplo. Aquí el comando se ejecutará a las 12 del mediodía del primer día de cada mes.

00 12 1 * * comando
Los meses están numerados a partir del 1.
Para agregar una entrada a una tabla, debe llamar a crontab con el parámetro -e:

crontab –e
Luego puede ingresar comandos de generación de programación:

30 10 * * * /home/likegeeks/Desktop/myscript
Gracias a este comando, el script se llamará todos los días a las 10:30. Si encuentra el error "Recurso no disponible temporalmente", ejecute el siguiente comando como root:

$ rm -f /var/run/crond.pid
Puede organizar el lanzamiento periódico de scripts usando cron aún más fácilmente usando varios directorios especiales:

/etc/cron.hourly /etc/cron.daily /etc/cron.weekly /etc/cron.monthly
Colocar un archivo de script en uno de ellos hará que se ejecute cada hora, diariamente, semanalmente o mensualmente, respectivamente.

Ejecute scripts al iniciar sesión y al iniciar el shell

Puede automatizar el inicio de scripts en función de diversos eventos, como el inicio de sesión del usuario o el inicio del shell. Puede leer sobre los archivos que se procesan en tales situaciones. Por ejemplo, estos son los siguientes archivos:

$HOME/.bash_profile $HOME/.bash_login $HOME/.perfil
Para ejecutar un script al iniciar sesión, coloque su llamada en el archivo .bash_profile.

¿Qué pasa con la ejecución de scripts cuando abres una terminal? El archivo .bashrc te ayudará a organizar esto.

Resultados

Hoy analizamos cuestiones relacionadas con la gestión del ciclo de vida de los scripts, hablamos sobre cómo ejecutar scripts en segundo plano y cómo programar su ejecución. La próxima vez, lea sobre las funciones de los scripts bash y el desarrollo de bibliotecas.

Queridos lectores! ¿Utiliza herramientas para programar secuencias de comandos de línea de comandos para que se ejecuten según una programación? En caso afirmativo, cuéntenos sobre ellos.

La última vez hablamos sobre cómo trabajar con flujos de entrada, salida y errores en scripts bash, sobre descriptores de archivos y sobre la redirección de flujos. Ahora ya sabes lo suficiente como para escribir algo propio. En esta etapa de dominar bash, es posible que tenga preguntas sobre cómo administrar los scripts en ejecución y cómo automatizar su lanzamiento.

Hasta ahora, escribimos los nombres de los scripts en la línea de comando y presionamos Enter, lo que provocó que los programas se ejecutaran inmediatamente, pero esa no es la única forma de invocar scripts. Hoy hablaremos sobre cómo un script puede funcionar con señales de Linux, sobre diferentes enfoques para ejecutar scripts y administrarlos durante la ejecución.

Señales de Linux

En Linux, hay más de tres docenas de señales generadas por el sistema o las aplicaciones. Aquí hay una lista de los más utilizados que seguramente serán útiles al desarrollar scripts de línea de comandos.
código de señal
Nombre
Descripción
1
Suspiro
Cerrando la terminal
2
FIRMA
Señal de parada del proceso por parte del usuario desde el terminal (CTRL+C)
3
SIGQUITAR
Señal para detener un proceso por parte del usuario desde la terminal (CTRL+\) con un volcado de memoria
9
SIGKILL
Terminación incondicional del proceso.
15
SIGNO
Señal de solicitud de terminación del proceso
17
SIGSTOP
Forzar la suspensión de un proceso pero no su terminación
18
SIGTSTP
Pausar un proceso desde la terminal (CTRL+Z) pero no cerrar
19
SEÑAL CONT
Continuar la ejecución de un proceso previamente detenido

Si el shell bash recibe una señal SIGHUP cuando cierra el terminal, sale. Antes de salir, envía una señal SIGHUP a todos los procesos que se ejecutan en él, incluidos los scripts en ejecución.

La señal SIGINT hace que la operación se detenga temporalmente. El kernel de Linux deja de asignar tiempo de procesador al shell. Cuando esto sucede, el shell notifica a los procesos enviándoles una señal SIGINT.

Los scripts Bash no controlan estas señales, pero pueden reconocerlas y ejecutar ciertos comandos para preparar el script para las consecuencias causadas por las señales.

Envío de señales a scripts

El shell bash le permite enviar señales a scripts mediante atajos de teclado. Esto resulta muy útil si necesita detener temporalmente un script en ejecución o finalizar su operación.

Terminar un proceso

La combinación de teclas CTRL + C genera una señal SIGINT y la envía a todos los procesos que se ejecutan en el shell, provocando que finalicen.

Ejecutemos el siguiente comando en el shell:

$dormir 100
Después de eso, completaremos su trabajo con la combinación de teclas CTRL + C.


Terminar un proceso desde el teclado

Detener temporalmente el proceso

La combinación de teclas CTRL + Z genera la señal SIGTSTP, que suspende el proceso pero no lo finaliza. Tal proceso permanece en la memoria y se puede reanudar su trabajo. Ejecutemos el comando en el shell:

$dormir 100
Y detenlo temporalmente con la combinación de teclas CTRL + Z.


Pausar el proceso

El número entre corchetes es el número de trabajo que el shell asigna al proceso. El shell trata los procesos que se ejecutan dentro de él como trabajos con números únicos. Al primer proceso se le asigna el número 1, al segundo el 2, y así sucesivamente.

Si pausa un trabajo vinculado a un shell e intenta salir de él, bash emitirá una advertencia.

Puede ver los trabajos suspendidos con el siguiente comando:

Sal –l


Lista de tareas

En la columna S, que muestra el estado del proceso, se muestra T para los procesos suspendidos. Esto indica que el comando está suspendido o en estado de seguimiento.

Si necesita finalizar un proceso suspendido, puede utilizar el comando kill. Puedes leer detalles al respecto.

Su llamada se ve así:

Matar ID de proceso

Intercepción de señal

Para habilitar el seguimiento de señales de Linux en un script, utilice el comando trap. Si el script recibe la señal especificada al llamar a este comando, la procesa de forma independiente, mientras que el shell no procesará dicha señal.

El comando trap permite que el script responda a señales que de otro modo serían procesadas por el shell sin su intervención.

Veamos un ejemplo que muestra cómo el comando trap especifica el código a ejecutar y una lista de señales, separadas por espacios, que queremos interceptar. En este caso es sólo una señal:

#!/bin/bash trap "echo " Ctrl-C atrapado"" SIGINT echo Este es un script de prueba count=1 while [ $count -le 10 ] do echo "Loop #$count" sleep 1 count=$(($ contar + 1)) hecho
El comando trap utilizado en este ejemplo imprime un mensaje de texto cada vez que encuentra una señal SIGINT, que se puede generar presionando Ctrl + C en el teclado.


Intercepción de señal

Cada vez que presiona CTRL + C, el script ejecuta el comando echo especificado al llamar a trace en lugar de permitir que el shell lo finalice.

Puede interceptar la señal de salida del script utilizando el nombre de la señal de SALIDA al llamar al comando trap:

#!/bin/bash trap "echo Adiós..." EXIT count=1 while [ $count -le 5 ] do echo "Loop #$count" sleep 1 count=$(($count + 1)) hecho


Interceptando la señal de salida del script

Cuando el script sale, ya sea normalmente o debido a una señal SIGINT, el shell interceptará y ejecutará el comando echo.

Modificación de señales interceptadas y cancelación de interceptación.

Para modificar las señales interceptadas por el script, puede ejecutar el comando trap con nuevos parámetros:

#!/bin/bash trap "echo "Ctrl-C está atrapado."" SIGINT count=1 while [ $count -le 5 ] do echo "Loop #$count" sleep 1 count=$(($count + 1) ) done trap "echo "¡Modifiqué la trampa!"" SIGINT count=1 while [ $count -le 5 ] do echo "Segundo bucle #$count" sleep 1 count=$(($count + 1)) done


Modificación de interceptación de señales.

Después de la modificación, las señales se procesarán de una manera nueva.

La interceptación de señales también se puede cancelar simplemente ejecutando el comando trap, pasándole un doble guión y el nombre de la señal:

#!/bin/bash trap "echo "Ctrl-C está atrapado."" SIGINT count=1 while [ $count -le 5 ] do echo "Loop #$count" sleep 1 count=$(($count + 1) ) trampa hecha - SIGINT echo "Acabo de quitar la trampa" cuenta=1 mientras que [ $cuenta -le 5 ] haz eco "Segundo bucle #$cuenta" dormir 1 cuenta=$(($cuenta + 1)) hecho
Si el script recibe una señal antes de que se cancele la captura, la procesará como se especifica en el comando de captura actual. Ejecutemos el script:

$ ./miscript
Y presione CTRL + C en el teclado.


Señal interceptada antes de que se cancelara la interceptación.

La primera pulsación de CTRL + C se produjo en el momento de la ejecución del script, cuando la interceptación de la señal estaba vigente, por lo que el script ejecutó el comando de eco asignado a la señal. Después de que la ejecución alcanzó el comando de desenganche, el comando CTRL + C funcionó como de costumbre, finalizando el script.

Ejecutar scripts de línea de comando en segundo plano

A veces, los scripts de bash tardan mucho en completar una tarea. Sin embargo, es posible que necesite poder trabajar normalmente en la línea de comando sin esperar a que se complete el script. No es tan difícil de implementar.

Si ha visto la lista de procesos generados por el comando ps, es posible que haya notado procesos que se ejecutan en segundo plano y no están vinculados a una terminal.
Escribamos el siguiente script:

#!/bin/bash count=1 while [ $count -le 10 ] duerme 1 count=$(($count + 1)) hecho
Ejecutémoslo especificando el carácter comercial (&) después del nombre:

$ ./miscipo &
Esto hará que se ejecute como un proceso en segundo plano.


Ejecutar un script en segundo plano

El script se iniciará en un proceso en segundo plano, su identificador se mostrará en la terminal y, cuando se complete su ejecución, verá un mensaje al respecto.

Tenga en cuenta que aunque el script se ejecuta en segundo plano, continúa usando la terminal para enviar mensajes a STDOUT y STDERR, lo que significa que el texto que genera o los mensajes de error serán visibles en la terminal.


Lista de procesos

Con este enfoque, si sale de la terminal, el script que se ejecuta en segundo plano también saldrá.

¿Qué sucede si desea que el script continúe ejecutándose después de cerrar la terminal?

Ejecutar scripts que no salen al cerrar la terminal

Los scripts se pueden ejecutar en procesos en segundo plano incluso después de salir de la sesión del terminal. Para hacer esto, puedes usar el comando nohup. Este comando le permite ejecutar un programa bloqueando las señales SIGHUP enviadas al proceso. Como resultado, el proceso se ejecutará incluso cuando salga del terminal en el que se inició.

Apliquemos esta técnica al ejecutar nuestro script:

Nohup ./myscript &
Esto es lo que se enviará al terminal.


equipo nohup

El comando nohup libera un proceso de la terminal. Esto significa que el proceso perderá las referencias a STDOUT y STDERR. Para no perder los datos generados por el script, nohup redirige automáticamente los mensajes que llegan a STDOUT y STDERR al archivo nohup.out.

Tenga en cuenta que si ejecuta varios scripts desde el mismo directorio, su salida terminará en un único archivo nohup.out.

Ver tareas

El comando jobs le permite ver los trabajos actuales que se están ejecutando en el shell. Escribamos el siguiente script:

#!/bin/bash count=1 while [ $count -le 10 ] hacer echo "Loop #$count" dormir 10 count=$(($count + 1)) hecho
Ejecutémoslo:

$ ./miscript
Y deténgalo temporalmente con la combinación de teclas CTRL + Z.


Ejecutar y pausar un script

Ejecutemos el mismo script en segundo plano, mientras redirigimos la salida del script a un archivo para que no muestre nada en la pantalla:

$ ./myscript > archivo de salida &
Al ejecutar ahora el comando jobs, veremos información tanto sobre el script suspendido como sobre el que se ejecuta en segundo plano.


Obtener información sobre guiones

El modificador -l al llamar al comando jobs indica que necesitamos información sobre las ID de los procesos.

Reiniciar trabajos suspendidos

Para reiniciar el script en segundo plano, puede utilizar el comando bg.

Ejecutemos el script:

$ ./miscript
Presione CTRL + Z, lo que detendrá temporalmente su ejecución. Ejecutemos el siguiente comando:

$bg


comando bg

El script ahora se ejecuta en segundo plano.

Si tiene varios trabajos suspendidos, puede pasar el número del trabajo al comando bg para reiniciar un trabajo específico.

Para reiniciar el trabajo normalmente, use el comando fg:

Planeando ejecutar scripts

Linux proporciona un par de formas de ejecutar scripts bash en un momento dado. Estos son el comando at y el programador de trabajos cron.

El comando at se ve así:

En el momento [-f nombre de archivo]
Este comando reconoce muchos formatos de hora.

  • Estándar, que indica horas y minutos, por ejemplo: 10:15.
  • Usando indicadores AM/PM, antes o después del mediodía, por ejemplo - 10:15PM.
  • Usando nombres especiales como ahora, mediodía, medianoche.
Además de poder especificar la hora a la que se debe ejecutar un trabajo, al comando at también se le puede pasar una fecha utilizando uno de sus formatos admitidos.
  • Un formato de fecha estándar en el que la fecha se escribe utilizando los patrones MMDDAA, MM/DD/AA o DD.MM.AA.
  • Una representación de texto de la fecha, por ejemplo, 4 de julio o 25 de diciembre, mientras que se puede especificar el año o prescindir de él.
  • Grabando como ahora + 25 minutos.
  • Vista de grabación mañana a las 10:15 p.m.
  • Tipo de grabación 10:15 + 7 días.
No profundicemos en este tema, veamos un caso de uso simple para el comando:

$ en -f ./myscript ahora


Programar trabajos usando el comando at

El modificador -M cuando se llama a se usa para enviar lo que genera el script por correo electrónico si el sistema está configurado para hacerlo. Si no es posible enviar un correo electrónico, esta clave simplemente suprimirá la salida.

Para ver la lista de trabajos en espera de ejecución, puede utilizar el comando atq:


Lista de tareas pendientes

Eliminar trabajos pendientes

El comando atrm le permite eliminar un trabajo pendiente. Al llamarlo, indique el número de tarea:

$ cajero 18


Eliminar un trabajo

Ejecutar scripts según un cronograma

Programar sus scripts para que se ejecuten una vez usando el comando at puede hacer la vida más fácil en muchas situaciones. Pero, ¿qué pasa si necesita que el script se ejecute a la misma hora todos los días, una vez a la semana o una vez al mes?

Linux tiene una utilidad crontab que le permite programar scripts que deben ejecutarse con regularidad.

Crontab se ejecuta en segundo plano y, basándose en los datos de las llamadas tablas cron, ejecuta trabajos según una programación.

Para ver una tabla de trabajos cron existente, use el siguiente comando:

$ crontab –l
Al programar una secuencia de comandos para que se ejecute según una programación, crontab acepta datos sobre cuándo se debe ejecutar el trabajo en el siguiente formato:

Minuto, hora, día del mes, mes, día de la semana.
Por ejemplo, si desea que un determinado script llamado comando se ejecute todos los días a las 10:30, esto corresponderá a la siguiente entrada en la tabla de tareas:

30 10 * * * comando
Aquí, el comodín "*" utilizado para los campos de día del mes, mes y día de la semana indica que cron debe ejecutar el comando todos los días de cada mes a las 10:30 a. m.

Si, por ejemplo, desea que el script se ejecute a las 4:30 p. m. todos los lunes, deberá crear la siguiente entrada en la tabla de tareas:

30 16 * * 1 comando
La numeración de los días de la semana comienza desde 0, 0 significa domingo, 6 significa sábado. Aquí hay otro ejemplo. Aquí el comando se ejecutará a las 12 del mediodía del primer día de cada mes.

00 12 1 * * comando
Los meses están numerados a partir del 1.
Para agregar una entrada a una tabla, debe llamar a crontab con el parámetro -e:

crontab –e
Luego puede ingresar comandos de generación de programación:

30 10 * * * /home/likegeeks/Desktop/myscript
Gracias a este comando, el script se llamará todos los días a las 10:30. Si encuentra el error "Recurso no disponible temporalmente", ejecute el siguiente comando como root:

$ rm -f /var/run/crond.pid
Puede organizar el lanzamiento periódico de scripts usando cron aún más fácilmente usando varios directorios especiales:

/etc/cron.hourly /etc/cron.daily /etc/cron.weekly /etc/cron.monthly
Colocar un archivo de script en uno de ellos hará que se ejecute cada hora, diariamente, semanalmente o mensualmente, respectivamente.

Ejecute scripts al iniciar sesión y al iniciar el shell

Puede automatizar el inicio de scripts en función de diversos eventos, como el inicio de sesión del usuario o el inicio del shell. Puede leer sobre los archivos que se procesan en tales situaciones. Por ejemplo, estos son los siguientes archivos:

$HOME/.bash_profile $HOME/.bash_login $HOME/.perfil
Para ejecutar un script al iniciar sesión, coloque su llamada en el archivo .bash_profile.

¿Qué pasa con la ejecución de scripts cuando abres una terminal? El archivo .bashrc te ayudará a organizar esto.

Resultados

Hoy analizamos cuestiones relacionadas con la gestión del ciclo de vida de los scripts, hablamos sobre cómo ejecutar scripts en segundo plano y cómo programar su ejecución. La próxima vez, lea sobre las funciones de los scripts bash y el desarrollo de bibliotecas.

Queridos lectores! ¿Utiliza herramientas para programar secuencias de comandos de línea de comandos para que se ejecuten según una programación? En caso afirmativo, cuéntenos sobre ellos.

Como cualquier otro sistema multitarea, Linux ejecuta varios procesos simultáneamente. En general, no lo engañaré, porque una computadora normal con un solo procesador solo puede realizar una tarea a la vez, razón por la cual Linux pone los procesos en cola para su ejecución.

Hay varios comandos básicos para gestionar procesos.

  • PD- mostrar una lista de procesos en ejecución
  • matar- envía una señal a uno o más procesos (básicamente para "matarlos")
  • empleos- una forma alternativa de ver los procesos que usted ejecuta
  • bg- pone la ejecución del proceso en segundo plano
  • fg- saca la ejecución del proceso del fondo

Aunque este conocimiento puede parecer bastante abstracto, puede tener aplicaciones prácticas incluso para el usuario medio que utiliza una interfaz gráfica. Quizás aún no sepas que la mayoría de los programas gráficos (si no todos) se pueden ejecutar mediante la línea de comandos. Por ejemplo, intentemos iniciar el navegador. Creo que la mayoría de los dispositivos Linux tienen Google Chrome o Firefox.

Enej@linux:/home/pub/www/vv$ google-chrome Se creó una nueva ventana en la sesión del navegador existente.

Puede especificar la URL que desea abrir

Enej@linux:/home/pub/www/vv$ google-chrome http://site Se creó una nueva ventana en la sesión del navegador existente.

Ya tengo Chrome ejecutándose a través de la GUI, por lo que el navegador informa que se está creando una nueva ventana en una sesión existente y le da control a la línea de comando. O, por ejemplo, si necesita abrir un administrador de archivos gráfico con derechos de root (el ejemplo funcionará para el shell gráfico Gnome con Nautilus instalado)

Enej@linux:/home/pub/www/vv$ sudo nautilus /root/ contraseña para enej:

Dado que el proceso no se inició en segundo plano, ya no puede realizar ninguna acción en esta ventana de terminal (puede presionar CTRL + C para finalizar el proceso).

Modo de fondo

Para hacer la vida más fácil, cuando se ejecutan programas gráficos o procesos que pueden ejecutarse durante mucho tiempo, su ejecución se suele poner en segundo plano, por ejemplo, ejecutemos el navegador en segundo plano.

Enej@linux:/home/pub/www/vv$ google-chrome http://sitio & 9248

Signo comercial ( & ) al final de la llamada del comando significa que la ejecución del proceso debe colocarse en segundo plano. En este caso, sigue siendo posible trabajar con esta ventana de terminal.

Pero de repente olvidaste poner un amplificador al final de la llamada, entonces hay otra manera. Primero debe detener la ejecución presionando CTRL + Z, luego obtenemos el control de la línea de comando y podemos llamar al comando bg, que pondrá el último proceso en ejecución en segundo plano. dicho con el ejemplo

Enej@linux:/home/pub/www/vv$ google-chrome http://sitio ^Z + Google-chrome detenido http://sitio enej@linux:/home/pub/www/vv$ bg + google- Chrome http://sitio &

Equipo fg Saca del fondo el último proceso en ejecución.

Lista de procesos en ejecución

Como ahora sabes cómo ejecutar comandos en segundo plano, fue bueno ver una lista de ellos. Para hacer esto, use el comando empleos o más poderoso PD

Enej@linux:/home/pub/www/vv$ jobs - Ejecutando nm-applet & (wd: ~/bin) + Ejecutando google-chrome http://site & enej@linux:/home/pub/www/vv $ ps PID TTY TIEMPO CMD 2304 pts/0 00:00:02 bash 11104 pts/0 00:00:01 chrome 11108 pts/0 00:00:00 chrome 11110 pts/0 00:00:00 chrome 11132 pts/0 00:00:00 chrome 12088 pts/0 00:00:00 ps 21165 pts/0 00:00:27 nm-applet

¿Cómo "matar" un proceso?

Si un proceso deja de responder (es decir, se cuelga), se debe "eliminar" por la fuerza. Creo que quienes usan FireFox se han encontrado con esto. Para tales tareas se utiliza el comando. matar. Pero primero necesitas definir de alguna manera el proceso. Para hacer esto puedes usar el comando empleos o PD. Con el primero se puede conocer el número de proceso y con el segundo, su identificador.

Enej@linux:/home/pub/www/vv$ google-chrome http://freaksidea..com & 15181 enej@linux:/home/pub/www/vv$ ps PID TTY TIME CMD 2304 pts/0 00: 00:02 bash 15181 pts/0 00:00:00 chrome 15238 pts/0 00:00:00 ps 21165 pts/0 00:00:27 nm-applet enej@linux:/home/pub/www/vv$ kill 15181

equipos fg Y bg como primer argumento, pueden tomar el número del proceso en ejecución para su entrada/salida posterior hacia/desde el fondo.

Más información sobre matar

En realidad el equipo matar Se utiliza para enviar varias señales a los procesos. Es solo que en la mayoría de los casos esta señal le dice al comando que debe finalizar. Si los programas se escriben correctamente, escuchan diversas señales del sistema operativo y responden a ellas. Por ejemplo, un editor de texto debe escuchar cualquier señal que notifique que los usuarios están desconectados o que la computadora se está apagando. Cuando él (el editor de texto) "escucha" dicha señal, debe guardar los documentos abiertos antes de terminar su trabajo. Equipo matar Puede enviar varios tipos de señales, para saber cuáles ingresa matar -l. A continuación se muestra una lista de las señales utilizadas con más frecuencia (el número entre paréntesis es el número de señal)

  • REGÍSTRESE(1)- originalmente estaba destinado a informar al programa sobre la pérdida de comunicación con el terminal de control (los terminales a menudo se conectaban al sistema mediante módems, por lo que el nombre de la señal proviene de colgado - colgar). La señal SIGHUP también se envía a la aplicación si el proceso líder de sesión ha completado su trabajo. Muchos programas demonio que no tienen un líder de sesión también procesan esta señal. En respuesta a recibir un SIGHUP, el demonio normalmente se reiniciará (o simplemente volverá a leer el archivo de configuración). De forma predeterminada, el programa que recibe esta señal finaliza.
  • SIGNO(2)- normalmente se envía a un proceso si el usuario del terminal ha dado un comando para finalizar el proceso (normalmente este comando es el método abreviado de teclado Ctrl + C)
  • TERMINO DE SEÑAL(15)- provoca una terminación "educada" del programa. Habiendo recibido esta señal, el programa puede realizar las operaciones necesarias antes de finalizar (por ejemplo, guardar documentos abiertos). Recibir SIGTERM no indica un error en el programa, sino más bien el deseo del sistema operativo o del usuario de finalizarlo.
  • SIGKILL(9)- provoca la terminación forzosa del programa. El programa no puede procesar ni ignorar esta señal.

Comando predeterminado matar envía SIGNO señal, pero también puede especificar el número de señal o su nombre. Digamos que tu Chrome está congelado (a veces mi reproductor flash deja de funcionar adecuadamente)

Enej@linux:/home/pub/www/vv$ google-chrome http://site & 22066 enej@linux:/home/pub/www/vv$ jobs - Ejecutando nm-applet & (wd: ~/bin) + Ejecutando google-chrome http://site & enej@linux:/home/pub/www/vv$ kill -SIGTERM %2 enej@linux:/home/pub/www/vv$ kill -SIGKILL %2 enej@linux :/home/pub/www/vv$ matar -9 %2

PD: Creo que 2 comandos serán muy interesantes para los principiantes: notificar-enviar(envía un mensaje a través del shell gráfico, aparece en la parte superior derecha en Gnome) y hablar(sintetizador de voz). Si no tiene ninguno de ellos, puede instalarlos usando el comando apto-obtener

Enej@linux:/home/pub/www/vv$ sudo apt-get install espeak notify-send

  1. ¿Necesita ejecutar una consulta SQL cuyo resultado debe esperar varias horas o días?
  2. ¿Necesita ejecutar una aplicación en segundo plano?
  3. ¿Necesita ejecutar un programa en segundo plano y poder volver a él?
  4. ¿Estás usando una consola Linux y trabajando con ssh?

Entonces definitivamente necesitas saber sobre pantalla.

Conceptos básicos de la pantalla

Pantalla en Linux- Son como “ventanas en Windows” que se pueden minimizar/ampliar. Puedes hacer algo en una ventana, por ejemplo, mirar fotos. Pero, si necesita escuchar música además de ver fotos, abrirá nuevo ventana (explorador), vaya al directorio de música y abra la canción en el programa de audio.

Cuando se trata de la consola Linux (especialmente cuando se trabaja en ssh), entonces será extremadamente inconveniente para nosotros ejecutar varias aplicaciones en una consola. O tal vez no sea posible realizar la segunda operación mientras la primera continúa su trabajo. Este es el primer punto. El segundo punto es que en caso de cualquier falla por su parte (por parte del cliente), la operación actual se interrumpirá. Un par de ejemplos de cuándo puede necesitar trabajar con ssh pantalla:

  • si copia o mueve una gran cantidad de archivos de un directorio a otro
  • si está ejecutando una consulta SQL pesada
  • si necesita ejecutar una aplicación que “secuestra” la consola

Probablemente te entristecerías mucho cuando, debido a un terminal cerrado accidentalmente o a una subida de tensión, se interrumpiera una consulta SQL que ya llevaba más de 10 horas ejecutándose. En el caso de la pantalla, la pantalla se ejecuta en el servidor, el iniciador de la solicitud será el objeto de la pantalla y la solicitud ya no se interrumpirá debido a problemas del cliente. Si se pierde la conexión, los procesos no se detienen, sino que continúan funcionando y puedes volver a ellos en cualquier momento.

trabajando con pantalla

para crear pantalla y comenzar a trabajar con él, escriba en la línea de comando:

donde prueba1 es un nombre arbitrario para el objeto de pantalla, puedes llamarlo como quieras para tu comodidad.

Esto creará una pantalla con el nombre prueba1. Ahora puede ejecutar cualquier operación de larga duración. Por ejemplo, ejecute una consulta SQL:

Mysql -u... seleccionar * de... actualizar...

Ya en esta etapa, si pierde Internet, cierra accidentalmente la pestaña del terminal, la computadora se reiniciará, no perderá ningún dato y la consulta SQL no se interrumpirá.

Para salir de la pantalla, presione las siguientes teclas:

+ & — salir de la pantalla. La solicitud seguirá ejecutándose. Todos los procesos que se ejecutan en las pantallas continúan ejecutándose.

Para regresar a su pantalla o a cualquier otra ventana de pantalla, puede ver todas las pantallas disponibles:

pantalla -r — seleccione y active una de las pantallas.

Cuando ya no necesite la sesión de pantalla, para finalizar completamente la sesión de pantalla, active la pantalla usando screen -r y haga clic dentro de él + o imprimir salir.