Proceso – programación en el shell
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.