Was sind mögliche Verwendungszwecke des Befehls exec?

10

Ich lerne execBefehl. Ich weiß, dass der execBefehl den Prozess ersetzt, der ihn gestartet hat. Es ist also nicht möglich, zu dem Prozess zurückzukehren, der durch einen execBefehl ersetzt wird .

Man könnte sagen, dass es das Ziel ist, es unmöglich zu machen, zu dem Prozess zurückzukehren, der ihn gestartet hat.

Aber wozu kann man so etwas wie execeinen Befehl zur Verfügung haben?

Mizech
quelle
1
Aus dem Wikipedia-Artikel: "Wrapper-Skripte verwenden diesen Befehl häufig, um ein Programm (entweder direkt oder über einen Interpreter oder eine virtuelle Maschine) auszuführen, nachdem Umgebungsvariablen oder eine andere Konfiguration festgelegt wurden."
Knb
1
besser geeignet für Informatik
Anwar
2
Persönlich finde ich exec ssh server-that-does-byobu-on-login.example.comes sehr erfreulich, dass ^ A ^ D das Terminal komplett herunterfährt. (Allgemeiner gesagt , exec byobu(oder exec screen, exec tmux).
Williham Totland

Antworten:

9

Im Wrapper-Skript

exec wird hauptsächlich in Wrapper-Skripten verwendet.

Wenn Sie die Umgebung für ein Programm ändern möchten, bevor Sie das Hauptprogramm ausführen, schreiben Sie häufig ein Skript und starten am Ende das Hauptprogramm. Es ist jedoch nicht erforderlich, dass das Skript zu diesem Zeitpunkt im Speicher bleibt. Wird execalso in diesen Fällen verwendet, damit das Hauptprogramm das Mutter-Skript ersetzen kann.

Hier ist ein praktisches Beispiel dafür. Das mate-terminal.wrapperSkript wird mit einem Mate-Terminal geliefert. Es beginnt mate-terminalmit einigen zusätzlichen Argumenten, indem die Benutzerumgebungen überprüft werden.

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

Hier ist zu beachten, dass es einen execAufruf gibt, der dieses Skript im Speicher ersetzt.

Hier ist eine ähnliche Frage, die auf der Unix & Linux StackExchange-Site beantwortet wurde - /unix//q/270929/19288

Umleiten von Dateideskriptoren

Eine weitere häufige Verwendung execist das Umleiten von Dateideskriptoren. stdin, stdout, stderrMit exec kann umgeleitet , um Dateien werden.

  1. Umleiten stdout- exec 1>filebewirkt, dass die Standardausgabe eine Datei ist, die filefür das Ende der aktuellen Shell-Sitzung benannt ist. Alles, was auf dem Display ausgegeben werden soll, befindet sich in der Datei.

  2. Umleiten stdin- Es kann auch verwendet werden , die die Umleitung stdinin eine Datei. Wenn Sie beispielsweise eine Skriptdatei ausführen möchten script.sh, können Sie diese einfach mit stdinin die Datei umleiten exec 0<script.sh.

Anwar
quelle
Okay. Danach hat 'mate-terminal' die PID, die das Wrapper-Skript hat? Und wird der Speicher verwendet, den das Wrapper-Skript verwendet hat? Das Wrapper-Skript ist also verschwunden. Andernfalls würden die beiden Skripte als separate Prozesse auf dem System existieren (mit zwei verschiedenen PIDs)?
Mizech
@ Mizech ja. Sie verwenden die gleiche PID
Anwar
@ Mizech Ich bin froh zu wissen, dass es geholfen hat :)
Anwar
1
Exzellentes Beispiel, das macht es wirklich klar
Zanna
Diese Antwort ist teilweise und übersieht eine der wichtigen (und typischen) Verwendungszwecke exec, nämlich die Verwendung bei der Umleitung von Dateideskriptoren.
Heemayl
9

Der exec Befehl ersetzt den aktuellen Shell-Prozess durch den angegebenen Befehl. Normalerweise wird beim Ausführen eines Befehls ein neuer Prozess erzeugt (gegabelt). Der exec Befehl erzeugt keinen neuen Prozess. Stattdessen wird der aktuelle Prozess mit dem neuen Befehl überlagert. Mit anderen Worten, der execBefehl wird anstelle der aktuellen Shell ausgeführt, ohne einen neuen Prozess zu erstellen.

Es gibt drei häufigste Verwendungszwecke des Befehls exec:

1. Austausch des Prozesses

Beispiel 1: Wenn Sie eine neuebashShell alsöffnen

$ bash 

in pstreees sieht aus wie

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

Die vorherige bashShell ist noch da und Sie haben eine neue bashShell. Wenn Sie dagegen eine neue Bash-Shell öffnen,

$ exec bash

die pstreeShows

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

Hier wird das Alte bashdurch das Neue ersetzt. Es ist besonders nützlich, mehrere Anmeldungen mit einem Befehl zu beenden. Es ist sicherer und beseitigt die Möglichkeit, versehentlich ein offenes Terminal zu verlassen. Siehe Beenden von root und user mit einem Befehl

Beispiel 2: Sie können eine Datei als öffnen

$ exec vi filename.txt

Wenn Sie das Programm beenden, vimüssen Sie das Terminal nicht separat schließen, da die Shell bereits ersetzt wurde. Sobald Sie das vi schließen, wird auch das Terminal geschlossen.

2. Eine Methode zur Umleitung von Dateideskriptoren innerhalb der Shell-Skripte

Der exec Befehl kann auch in Shell-Skripten verwendet werden, die Dateideskriptoren dynamisch öffnen, schließen und kopieren. Dies ermöglicht die Umleitung von STDIN, STDERR, STDOUT und anderen Dateideskriptoren zu verschiedenen Dateien innerhalb des Shell-Skripts anstelle der Befehlsaufrufzeichenfolge. Wenn Sie keinen Befehl oder keine Argumente angeben, können Sie Umleitungssymbole und Dateideskriptoren angeben, um diese Funktionen auszuführen.

Angenommen, Sie haben ein Shell-Skript, für das script.shSie eine Protokolldatei haben möchten. script.logSie können Folgendes verwenden exec:

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

das ist äquivalent zu

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

3. Erstellen von Phasen des Prozesses mit dem Befehl exec

Sie können auch den Befehl exec verwenden, um eine Reihe von Shell-Skripten zu erstellen, die sich nacheinander wie Phasen des Prozesses ausführen. Anstatt jedes Mal neue Prozesse zu erzeugen, wenn Sie das Steuerelement auf das nächste Skript übertragen müssen, führen Sie den Befehl exec aus.

In diesem Fall sollte die letzte Anweisung jeder Stufe ein execBefehl sein, der die nächste Stufe aufruft.

Weitere Informationen finden Sie unter Verwendung des execBefehls in Shell-Skripten .

Hinweis: Ein Teil der obigen Ausführungen stammt daraus.

Souravc
quelle
1
Nur vollständige Antwort (bisher).
Heemayl
Ich habe exec immer aus Effizienzgründen verwendet. Wenn Sie einen Daemon mit exec ausführen, benötigen Sie nur einen aktiven Prozess anstelle von zwei. Wenn Sie den Bash-Prozess verlassen, werden unter anderem ein paar MB RAM verschwendet.
gmatht
2

Soweit ich weiß, wird es auch verwendet, um Dateideskriptoren (zum Beispiel STDOUT, STDERR, STDIN) eines Bash-Skripts umzuleiten.

So können Sie beispielsweise mithilfe der STDIN-Umleitung aus einer Datei anstelle der Tastatur lesen und mithilfe der STDOUT-Umleitung (oder je nach Programm STDERR) in eine Datei anstelle des Terminals schreiben.

Levin Palm
quelle
1
Diese Antwort ist teilweise und ergänzt diese Antwort nur .
Heemayl