Quali sono gli usi possibili del comando exec?


10

Sto imparando il execcomando. So che il execcomando sostituisce il processo che lo ha avviato. Quindi non è possibile tornare al processo che viene sostituito dal execcomando.

Si potrebbe dire che il suo scopo è rendere impossibile il ritorno al processo che l'ha avviato.

Ma quali sono gli altri usi per avere qualcosa di simile execdisponibile come comando?



1
dall'articolo di Wikipedia: "Gli script wrapper usano spesso questo comando per eseguire un programma (direttamente o tramite un interprete o una macchina virtuale) dopo aver impostato le variabili di ambiente o altre configurazioni."
Knb

1
più adatto per l' Informatica
Anwar

2
Personalmente, trovo exec ssh server-that-does-byobu-on-login.example.commolto piacevole, in quanto ^ A ^ D spegne del tutto il terminale. (Più in generale, exec byobu(o exec screen, exec tmux).
Williham Totland,

Risposte:


9

Nello script wrapper

exec viene utilizzato principalmente negli script wrapper.

Se si desidera modificare l'ambiente per un programma prima di eseguire il programma principale, si scriverà spesso uno script e alla fine avvierà il programma principale. Ma non è necessario che la sceneggiatura rimanga in memoria in quel momento. Quindi, execviene utilizzato in questi casi in modo che il programma principale possa sostituire lo script madre.

Ecco un esempio pratico di esso. Il suo mate-terminal.wrapperscript viene fornito con mate-terminal. Inizia mate-terminalcon alcuni argomenti extra controllando gli ambienti dell'utente.

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

Il punto da notare qui è, c'è una execchiamata, che sostituisce questo script in memoria.

Ecco una domanda simile con risposta nel sito StackExchange di Unix e Linux - https://unix.stackexchange.com/q/270929/19288

Per reindirizzare i descrittori di file

Un altro uso comune di execè nel reindirizzamento dei descrittori di file. stdin, stdout, stderrPuò essere reindirizzato a file utilizzando exec.

  1. Reindirizzamento stdout: exec 1>filel'output standard sarà un file denominato fileper la fine della sessione di shell corrente. Tutto il contenuto da visualizzare sul display sarà nel file.

  2. Reindirizzamento stdin: può anche essere utilizzato per reindirizzare stdina un file. Ad esempio, se si desidera eseguire un file di script script.sh, è possibile reindirizzare semplicemente stdinal file utilizzando exec 0<script.sh.


Va bene. Successivamente 'mate-terminal' avrà il PID dello script wrapper? E utilizzerà la memoria utilizzata dallo script wrapper? Quindi lo script wrapper è svanito. Altrimenti i due script esisterebbero come processi separati sul sistema (con due PID diversi)?
mizech,

@mizech sì. usano lo stesso PID
Anwar,

@mizech Sono contento di sapere che ha aiutato :)
Anwar,

1
Ottimo esempio, questo lo rende davvero chiaro
Zanna

Questa risposta è parziale e manca di uno degli usi importanti (e tipici) di execquesto è l'uso nel reindirizzamento dei descrittori di file.
heemayl,

9

Il exec comando sostituisce il processo di shell corrente con il comando specificato. Normalmente, quando si esegue un comando, viene generato un nuovo processo (biforcato). Il exec comando non genera un nuovo processo. Al contrario, il processo corrente viene sovrapposto al nuovo comando. In altre parole, il execcomando viene eseguito al posto della shell corrente senza creare un nuovo processo.

Esistono tre usi più comuni del comando exec:

1. Sostituzione del processo

Esempio-1: se si apre una nuovabashshell come

$ bash 

in pstreeesso si presenta come

├─gnome-terminale
        ├─bash───bash───pstree

La bashshell precedente è ancora lì e hai una nuova bashshell. Considerando che se si apre una nuova shell bash come,

$ exec bash

gli pstreespettacoli

├─gnome-terminale
        ├─bash───pstree

Qui il vecchio bashviene sostituito con uno nuovo. È particolarmente utile uscire da più accessi in un solo comando. È più sicuro e sradica la possibilità di lasciare un terminale aperto per errore. Vedi Esci sia da root che da utente con un solo comando

Esempio-2: è possibile aprire un file come

$ exec vi filename.txt

Quando si esce, vinon è necessario chiudere il terminale separatamente poiché la shell è già stata sostituita. Non appena si chiude vi, anche il terminale viene chiuso.

2. Un metodo di reindirizzamento dei descrittori di file all'interno degli script della shell

Il exec comando può essere utilizzato anche negli script di shell in modo dinamico per aprire, chiudere e copiare i descrittori di file. Ciò consente di eseguire il reindirizzamento di STDIN, STDERR, STDOUT e altri descrittori di file su vari file all'interno dello script della shell, anziché sulla stringa di chiamata del comando. Se non si specifica un comando o argomenti, è possibile specificare simboli di reindirizzamento e descrittori di file per eseguire queste funzioni.

Supponi di avere uno script shell script.shche desideri disporre di un file di registro script.log, che puoi utilizzare execcome,

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

che equivale a

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

3. Creazione delle fasi del processo utilizzando il comando exec

È inoltre possibile utilizzare il comando exec per creare un set di script shell che si eseguono l'un l'altro in sequenza come fasi del processo. Invece di generare nuovi processi ogni volta che è necessario trasferire il controllo allo script successivo, si esegue il comando exec.

In questo caso, l'ultima istruzione di ogni fase dovrebbe essere un execcomando che invoca la fase successiva.

Vedi di più sugli usi del execcomando negli script di shell .

Nota: parte di cui sopra è tratta da questo.


1
Solo una risposta completa (finora).
heemayl,

Tutte le volte che ho usato exec sono state per efficienza. Se esegui un demone con exec devi solo avere un processo attivo invece di due. Lasciando il processo bash si spreca un paio di MB di ariete, tra le altre cose.
Gmatht,

2

Per quanto ne so, viene anche utilizzato per reindirizzare i descrittori di file (ad esempio, STDOUT, STDERR, STDIN) di uno script bash.

Quindi, ad esempio, è possibile leggere da un file invece dalla tastiera utilizzando il reindirizzamento STDIN e scrivere su un file anziché sul terminale tramite il reindirizzamento STDOUT (o potrebbe essere STDERR a seconda del programma).


1
Questa risposta parziale e completa solo questa risposta .
heemayl,
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.