Quelles sont les utilisations possibles de la commande exec?

10

J'apprends la execcommande. Je sais que la execcommande remplace le processus qui l'a démarrée. Il n'est donc pas possible de revenir au processus qui est remplacé par la execcommande.

On pourrait dire que son but est de rendre impossible le retour au processus qui l'a déclenché.

Mais quelles sont les autres utilisations pour avoir quelque chose comme execdisponible en tant que commande?

mizech
la source
1
de l'article de wikipedia: "Les scripts de wrapper utilisent souvent cette commande pour exécuter un programme (directement ou via un interpréteur ou une machine virtuelle) après avoir défini des variables d'environnement ou une autre configuration."
knb
1
plus approprié pour l' informatique
Anwar
2
Personnellement, je trouve exec ssh server-that-does-byobu-on-login.example.comcela très agréable, en ce que ^ A ^ D ferme complètement le terminal. (Plus généralement, exec byobu(ou exec screen, exec tmux).
Williham Totland

Réponses:

9

Dans le script wrapper

exec est principalement utilisé dans les scripts wrapper.

Si vous souhaitez modifier l'environnement d'un programme avant d'exécuter le programme principal, vous écrivez souvent un script et à la fin de celui-ci démarrez le programme principal. Mais il n'est pas nécessaire que le script reste en mémoire à ce moment-là. Donc, execest utilisé dans ces cas pour que le programme principal puisse remplacer le script mère.

En voici un exemple pratique. Son mate-terminal.wrapperscript est livré avec mate-terminal. Il démarre le mate-terminalavec quelques arguments supplémentaires en vérifiant les environnements de l'utilisateur.

#!/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);

Le point à noter ici est, il y a un execappel, qui remplace ce script en mémoire.

Voici une réponse à une question similaire dans Unix & Linux StackExchange Site - /unix//q/270929/19288

Pour rediriger les descripteurs de fichiers

Une autre utilisation courante de la execredirection de descripteurs de fichiers est. stdin, stdout, stderrPeuvent être redirigés vers des fichiers en utilisant exec.

  1. Redirection stdout- exec 1>fileentraînera la sortie standard d'être un fichier nommé filepour la fin de la session shell en cours. Tout ce qui doit être affiché sur l'écran sera dans le fichier.

  2. Redirection stdin- Il peut également être utilisé pour rediriger le stdinvers un fichier. Par exemple, si vous souhaitez exécuter un fichier de script script.sh, vous pouvez simplement rediriger le stdinvers le fichier à l'aide de exec 0<script.sh.

Anwar
la source
D'accord. Ensuite, 'mate-terminal' aura le PID du script wrapper? Et utilisera la mémoire utilisée par le script wrapper? Ainsi, le script wrapper a disparu. Sinon, les deux scripts existeraient en tant que processus distincts sur le système (avec deux PID différents)?
mizech
@mizech oui. ils utilisent le même PID
Anwar
@mizech Heureux de savoir que cela a aidé :)
Anwar
1
Excellent exemple, cela rend vraiment clair
Zanna
Cette réponse est partielle et manque l'une des utilisations importantes (et typiques) de execson utilisation dans la redirection des descripteurs de fichiers.
heemayl
9

La exec commande remplace le processus shell actuel par la commande spécifiée. Normalement, lorsque vous exécutez une commande, un nouveau processus est généré (bifurqué). La exec commande ne génère pas de nouveau processus. Au lieu de cela, le processus en cours est superposé avec la nouvelle commande. En d'autres termes, la execcommande est exécutée à la place du shell actuel sans créer de nouveau processus.

Il existe trois utilisations les plus courantes de la commande exec:

1. Remplacement du processus

Exemple 1: si vous ouvrez un nouveaubashshell en tant que

$ bash 

en pstreeelle ressemble

├─gnome-terminal
        ├─bash───bash───pstree

Le bashshell précédent est toujours là et vous avez obtenu un nouveau bashshell. Alors que si vous ouvrez un nouveau shell bash comme,

$ exec bash

les pstreespectacles

├─gnome-terminal
        ├─bash───pstree

Ici, l'ancien bashest remplacé par un nouveau. Il est particulièrement utile de quitter plusieurs connexions en une seule commande. Il est plus sécurisé et supprime les chances de quitter un terminal ouvert par erreur. Voir Quitter à la fois root et user avec une seule commande

Exemple-2: vous pouvez ouvrir un fichier en tant que

$ exec vi filename.txt

Lorsque vous quittez, viil n'est pas nécessaire de fermer le terminal séparément car le shell est déjà remplacé. Dès que vous fermez le vi, le terminal est également fermé.

2. Une méthode de redirection des descripteurs de fichiers dans les scripts shell

La exec commande peut également être utilisée dans des scripts shell pour ouvrir, fermer et copier dynamiquement des descripteurs de fichiers. Cela permet d'effectuer une redirection de STDIN, STDERR, STDOUT et d'autres descripteurs de fichiers vers divers fichiers à l'intérieur du script shell, au lieu de la chaîne d'invocation de commande. Si vous ne spécifiez pas de commande ou d'arguments, vous pouvez spécifier des symboles de redirection et des descripteurs de fichier pour exécuter ces fonctions.

Disons que vous avez un script shell que script.shvous souhaitez avoir un fichier journal script.log, vous pouvez utiliser en exectant que,

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

ce qui équivaut à

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

3. Création d'étapes du processus à l'aide de la commande exec

Vous pouvez également utiliser la commande exec pour créer un ensemble de scripts shell qui s'exécutent séquentiellement comme les étapes du processus. Au lieu de générer de nouveaux processus chaque fois que vous devez transférer le contrôle vers le script suivant, vous exécutez la commande exec.

Dans ce cas, la dernière instruction de chaque étape doit être une execcommande qui appelle l'étape suivante.

Voir les utilisations de la execcommande dans les scripts shell pour en savoir plus.

Remarque: une partie de ce qui précède est tirée de cela.

souravc
la source
1
Seule réponse complète (jusqu'à présent).
heemayl
Toutes les fois où j'ai utilisé exec ont été pour l'efficacité. Si vous exécutez un démon avec exec, vous n'avez besoin que d'un processus actif au lieu de deux. Laisser le processus bash autour gaspille quelques Mo de RAM, entre autres choses.
gmatht
2

Autant que je sache, il est également utilisé pour rediriger les descripteurs de fichiers (par exemple, STDOUT, STDERR, STDIN) d'un script bash.

Ainsi, par exemple, vous pouvez lire à partir d'un fichier à la place du clavier en utilisant la redirection STDIN et écrire dans un fichier au lieu du terminal par la redirection STDOUT (ou pourrait être STDERR selon le programme).

Levin Palm
la source
1
Cette réponse est partielle et ne fait que compléter cette réponse .
heemayl