Proceso – programación en el shell
![proceso colorful toothed wheels](https://www.frexus.dev/wp-content/uploads/2023/12/pexels-photo-171198-1.jpeg)
Un proceso es una instancia en ejecución de un programa. Cuando se ejecuta un programa en el shell, se crea un nuevo proceso para ese programa.
Fork y Exec
- La llamada al sistema
fork()
se utiliza para crear un nuevo proceso que es una copia exacta del proceso padre. Después de hacer unfork()
, ambos procesos (el padre y el hijo) continúan ejecutando el mismo código a partir de ese punto. El hijo se diferencia del padre por su PID, que es 0 después de unfork()
exitoso. - La llamada al sistema
exec()
se utiliza para reemplazar la imagen del proceso actual con un nuevo programa. Después de unexec()
, el programa original se detiene y es reemplazado por el nuevo programa.
# Ejemplo de fork y exec # Este script crea un nuevo proceso hijo que ejecuta un programa diferente # Nombre del script: mi_script.sh echo "Inicio del script (PID $$)" # Crear un nuevo proceso hijo ./mi_programa_hijo.sh & child_pid=$! echo "Proceso hijo creado con PID $child_pid" # Esperar a que el proceso hijo termine wait $child_pid echo "Fin del script"
# Contenido de mi_programa_hijo.sh # Este es el programa que será ejecutado por el proceso hijo # Nombre del script: mi_programa_hijo.sh echo "Este es el programa hijo (PID $$)"
Comunicación entre Procesos (IPC):
Los procesos pueden comunicarse mediante mecanismos de IPC (Inter-Process Communication). Los pipes (|
) permiten la comunicación entre la salida de un proceso y la entrada de otro. Además, los archivos temporales, la memoria compartida y las colas de mensajes son ejemplos de mecanismos IPC más avanzados.
# Ejemplo de comunicación mediante pipes # Este script utiliza un pipe para enviar la salida de un comando a otro # Concatenar dos archivos y contar las líneas resultantes cat archivo1.txt archivo2.txt | wc -l
Señales:
Las señales son mecanismos de comunicación asincrónica entre procesos o entre el kernel y los procesos. Puedes enviar señales a los procesos utilizando comandos como kill
. Por ejemplo, kill -SIGTERM PID
envía la señal de terminación (SIGTERM
) a un proceso con el PID especificado.
# Ejemplo de envío de señal a un proceso # Este script crea un proceso en segundo plano y luego envía una señal para terminarlo # Iniciar un proceso en segundo plano ./mi_programa.sh & # Obtener el PID del proceso en segundo plano child_pid=$! # Enviar una señal para terminar el proceso kill -SIGTERM $child_pid
Procesos en Segundo Plano:
Puedes ejecutar procesos en segundo plano agregando &
al final del comando. Esto libera la terminal para que puedas seguir ingresando comandos mientras el proceso se ejecuta en segundo plano.
# Ejemplo de ejecución de un proceso en segundo plano # Este script ejecuta un programa en segundo plano y continúa con otras tareas # Ejecutar un programa en segundo plano ./mi_programa.sh & # Continuar con otras tareas sin esperar a que el programa termine echo "Haciendo otras cosas mientras mi_programa.sh se ejecuta en segundo plano"
Despacho de Trabajo y Prioridades:
Puedes ajustar la prioridad de un proceso usando comandos como nice
o renice
. Esto puede afectar la cantidad de tiempo de CPU que el proceso recibe en comparación con otros procesos en ejecución.
# Ejemplo de ajuste de prioridad de un proceso # Este script ejecuta un programa con una prioridad más baja usando el comando nice # Ejecutar un programa con prioridad más baja nice -n 10 ./mi_programa.sh
Manejo de Errores:
Al ejecutar programas en el shell, es importante manejar los errores adecuadamente. Puedes verificar el código de salida de un programa utilizando $?
. Un valor de 0 generalmente indica éxito, mientras que otros valores indican algún tipo de error.
# Ejemplo de manejo de errores # Este script ejecuta un programa y verifica su código de salida para determinar el éxito o el error # Ejecutar un programa ./mi_programa.sh # Verificar el código de salida if [ $? -eq 0 ]; then echo "Éxito" else echo "Error" fi
Estos son solo algunos aspectos clave del manejo de procesos y llamadas al sistema en el contexto de la programación en el shell. La combinación de estas herramientas proporciona una gran flexibilidad para la creación y gestión de procesos en entornos de línea de comandos.