exec

  • english
  • spanish

exec es un comando interno de la shell que fuerza a que un binario se ejecute sobre el propio proceso de la shell en vez de sobre un hijo.

Cuando en shell-script se invoca un comando, normalmente se crea un proceso hijo que lo ejecute. Esto a nivel de llamadas al sistema sería el típico:

if( (pid=fork()) == 0) { exec(command); exit(); } wait();

En general ésto es lo que queremos, para poder seguir ejecutando comandos en la shell. Sin embargo puede haber situaciones en las que no, casos típicos:

  • tenemos un programa que va a monitorizar la ejecución de otro, y si hay un proceso shell por en medio no funciona bien, pero necesitamos esa shell para lo que sea (p.ej. preparar variables de entorno, ejecutar el comando con nice, etc.)
  • lanzamos un programa vía un shell-script en MacOS y en el dock salen dos iconos

Con exec en lugar de hacer un fork que ejecute el comando, se ejecuta directamente sobre el proceso actual. Importante darse cuenta que, por lo tanto, cualquier comando que hubiera detrás del exec en la shell nunca se llega a ejecutar, pues el comando digamos que “suplanta” a la shell.

#!/bin/sh #inicializar variables, parsear parámetros, etc. export IP=$1 exec nice comando $*

2 pensamientos en “exec

  1. Pues no lo pillo bien, me encontraba la semana pasada necesitando usar algo de exec y fork en perl, pero no lo pillo…

    P.D: Felicidades por el blog.

    saludos

  2. Probablemente no tenga nada que ver, lo que comento aquí es shell-script de línea de comandos (bash para entendernos) y lo que comentaba de llamadas al sistema C. Supongo que en perl será más similar al C que al bash pero nunca me ha hecho falta meterme a ese nivel en perl.

Deja un comentario

Tu dirección de correo electrónico no será publicada. Los campos necesarios están marcados *

Puedes usar las siguientes etiquetas y atributos HTML: <a href="" title=""> <abbr title=""> <acronym title=""> <b> <blockquote cite=""> <cite> <code> <del datetime=""> <em> <i> <q cite=""> <strike> <strong>

Login with:
Desarrollado por Sociable!