Archivo de la etiqueta: fork

exec

[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 $*

[/spanish]
[english]
exec is a built-in shell command that forces a binary to be executed by the currently running shell process instead of forking the process and running the binary on that child process.

When you run a command on a shell-script, it forks a child process and runs the command there. On a syscall level this is the classic:


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

And this is usually what we want, because we will keep running commands after that one. Nevertheless, sometimes this is a problem, like when:

  • we have a program that’s going to monitor a given process, and it doesn’t run properly if there’s an intermediate shell process but we need to run this second process via a shel-script for whatever reasons (to initialize some variables, run the program with nice, whatever)
  • on MacOS we’re running a program via a shell-script and get two icons on the dock, one for the shell and another one for the program

Running a command with exec forces the shell not to fork, but to run the command directly over the shell process. An important thing to note here is that the shell-script will end there, no further commands of the shell script will be executed as the shell process will be substituted by the command process, so to speak.


#!/bin/sh

# initialize variables, parse command-line parameters, etc.
export IP=$1

exec nice command $*

[/english]