¿Cuáles son los posibles usos del comando exec?

10

Estoy aprendiendo el execcomando. Sé que el execcomando reemplaza el proceso que lo inició. Por lo tanto, no es posible volver al proceso que se reemplaza por execcomando.

Se podría decir que su propósito es hacer que sea imposible volver al proceso que lo inició.

¿Pero cuáles son otros usos para tener algo como execdisponible como un comando?

mizech
fuente
1
del artículo de Wikipedia: "Los scripts de envoltura a menudo usan este comando para ejecutar un programa (ya sea directamente o mediante un intérprete o una máquina virtual) después de establecer variables de entorno u otra configuración".
knb
1
más adecuado para Informática
Anwar
2
Personalmente, me parece exec ssh server-that-does-byobu-on-login.example.commuy agradable, ya que ^ A ^ D cierra la terminal por completo. (Más generalmente, exec byobu(o exec screen, exec tmux).
Williham Totland

Respuestas:

9

En script de contenedor

exec se usa principalmente en scripts de envoltura.

Si desea modificar el entorno de un programa antes de ejecutar el programa principal, a menudo escribiría un script y al final comenzaría el programa principal. Pero no es necesario que el script permanezca en la memoria en ese momento. Entonces, execse usa en estos casos para que el programa principal pueda reemplazar el script madre.

Aquí hay un ejemplo práctico de ello. Su mate-terminal.wrapperscript viene con mate-terminal. Comienza mate-terminalcon algunos argumentos adicionales al verificar los entornos del usuario.

#!/usr/bin/perl -w

my $login=0;

while ($opt = shift(@ARGV))
{
    if ($opt eq '-display')
    {
        $ENV{'DISPLAY'} = shift(@ARGV);
    }
    elsif ($opt eq '-name')
    {
        $arg = shift(@ARGV);
        push(@args, "--window-with-profile=$arg");
    }
    elsif ($opt eq '-n')
    {
        # Accept but ignore
        print STDERR "$0: to set an icon, please use -name <profile> and set a profile icon\n"
    }
    elsif ($opt eq '-T' || $opt eq '-title')
    {
        push(@args, '-t', shift(@ARGV));
    }
    elsif ($opt eq '-ls')
    {
        $login = 1;
    }
    elsif ($opt eq '+ls')
    {
        $login = 0;
    }
    elsif ($opt eq '-geometry')
    {
        $arg = shift(@ARGV);
        push(@args, "--geometry=$arg");
    }
    elsif ($opt eq '-fn')
    {
        $arg = shift(@ARGV);
        push(@args, "--font=$arg");
    }
    elsif ($opt eq '-fg')
    {
        $arg = shift(@ARGV);
        push(@args, "--foreground=$arg");
    }
    elsif ($opt eq '-bg')
    {
        $arg = shift(@ARGV);
        push(@args, "--background=$arg");
    }
    elsif ($opt eq '-tn')
    {
       $arg = shift(@ARGV);
       push(@args, "--termname=$arg");
    }
    elsif ($opt eq '-e')
    {
        $arg = shift(@ARGV);
        if (@ARGV)
        {
            push(@args, '-x', $arg, @ARGV);
            last;
        }
        else
        {
            push(@args, '-e', $arg);
        }
        last;
    }
    elsif ($opt eq '-h' || $opt eq '--help')
    {
        push(@args, '--help');
    }
}
if ($login == 1)
{
    @args = ('--login', @args);
}
exec('mate-terminal',@args);

El punto a notar aquí es que hay una execllamada que reemplaza este script en la memoria.

Aquí hay una pregunta similar respondida en el sitio StackExchange de Unix y Linux: /unix//q/270929/19288

Para redirigir descriptores de archivo

Otro uso común de execes en la redirección de descriptores de archivos. stdin, stdout, stderrPuede ser redirigido a archivos usando Exec.

  1. Redireccionamiento stdout: exec 1>filehará que la salida estándar sea un archivo denominado filepara el final de la sesión de shell actual. Todo lo que se envíe a la pantalla estará en el archivo.

  2. Redireccionamiento stdin: también se puede usar para redirigir stdina un archivo. Por ejemplo, si desea ejecutar un archivo de script script.sh, simplemente puede redirigirlo stdinal archivo usando exec 0<script.sh.

Anwar
fuente
Bueno. ¿Luego 'mate-terminal' tendrá el PID que tiene el script de envoltura? ¿Y usará la memoria que usó el wrapper-script? Entonces el guión de envoltura se ha desvanecido. De lo contrario, los dos scripts existirían como procesos separados en el sistema (con dos PID diferentes)?
mizech
@mizech sí. usan el mismo PID
Anwar
@mizech Me alegra saber que ayudó :)
Anwar
1
Excelente ejemplo, eso lo deja muy claro
Zanna
Esta respuesta es parcial y pierde uno de los usos importantes (y típicos) de execeso es su uso en la redirección de descriptores de archivos.
heemayl
9

El exec comando reemplaza el proceso de shell actual con el comando especificado. Normalmente, cuando ejecuta un comando, se genera un nuevo proceso (bifurcado). El exec comando no genera un nuevo proceso. En cambio, el proceso actual se superpone con el nuevo comando. En otras palabras, el execcomando se ejecuta en lugar del shell actual sin crear un nuevo proceso.

Hay tres usos más comunes del comando exec:

1. Reemplazo de proceso

Ejemplo 1: si abre un nuevobashshell como

$ bash 

en pstreeparece

Omegnome-terminal
        ├─bash───bash───pstree

El bashshell anterior todavía está allí y tienes un nuevo bashshell. Mientras que si abres un nuevo bash shell como,

$ exec bash

los pstreeshows

Omegnome-terminal
        ───bash───pstree

Aquí lo viejo bashse reemplaza por uno nuevo. Es particularmente útil salir del inicio de sesión múltiple en un comando. Es más seguro y erradica la posibilidad de dejar una terminal abierta por error. Vea Salir de la raíz y del usuario con un comando

Ejemplo-2: puede abrir un archivo como

$ exec vi filename.txt

Cuando salga vino hay necesidad de cerrar el terminal por separado ya que el shell ya está reemplazado. Tan pronto como cierre el vi, la terminal también estará cerrada.

2. Un método de redireccionamiento de descriptores de archivo dentro de los scripts de shell

El exec comando también se puede usar en scripts de shell para abrir, cerrar y copiar descriptores de archivos dinámicamente. Eso permite realizar la redirección de STDIN, STDERR, STDOUT y otros descriptores de archivo a varios archivos dentro del script de shell, en lugar de la cadena de invocación de comando. Si no especifica un comando o argumentos, puede especificar símbolos de redirección y descriptores de archivo para realizar estas funciones.

Supongamos que tiene un script de shell script.shque desea tener un archivo de registro script.log, puede usar execcomo,

LOG=/path/to/script.log
exec 1>>$LOG
exec 2>&1

que es equivalente a

./script &>> /path/to/script.log
./script >>  /path/to/script.log 2>&1

3. Crear etapas del proceso usando el comando exec

También puede usar el comando exec para crear un conjunto de scripts de shell que se ejecuten entre sí secuencialmente como etapas del proceso. En lugar de generar nuevos procesos cada vez que necesite transferir el control al siguiente script, ejecute el comando exec.

En este caso, la última declaración de cada etapa debe ser un execcomando que invoca la siguiente etapa.

Consulte los usos del execcomando en los scripts de shell para obtener más información.

Nota: Parte de lo anterior se toma de esto.

souravc
fuente
1
Solo respuesta completa (hasta ahora).
heemayl
Todas las veces que he usado exec han sido por eficiencia. Si ejecuta un demonio con exec, solo necesita tener un proceso activo en lugar de dos. Dejar el proceso bash desperdicia un par de MB de RAM, entre otras cosas.
gmatht
2

Hasta donde sé, también se usa para redirigir los descriptores de archivos (por ejemplo, STDOUT, STDERR, STDIN) de un script bash.

Entonces, por ejemplo, puede leer desde un archivo desde el teclado utilizando la redirección STDIN y escribir en un archivo en lugar del terminal mediante la redirección STDOUT (o podría ser STDERR dependiendo del programa).

Levin Palm
fuente
1
Esta respuesta es parcial y solo complementa esta respuesta .
heemayl