Apa kemungkinan menggunakan perintah exec?

10

Saya belajar execperintah. Saya tahu bahwa execperintah itu menggantikan proses yang telah memulainya. Jadi itu tidak mungkin untuk kembali ke proses yang digantikan oleh execperintah.

Orang dapat mengatakan bahwa tujuannya adalah untuk membuatnya tidak mungkin untuk kembali ke proses yang memulai itu.

Tetapi apa kegunaan lain untuk memiliki sesuatu seperti exectersedia sebagai perintah?

mizech
sumber
1
dari artikel wikipedia: "Script wrapper sering menggunakan perintah ini untuk menjalankan program (baik secara langsung atau melalui juru bahasa atau mesin virtual) setelah menetapkan variabel lingkungan atau konfigurasi lainnya."
knb
1
lebih cocok untuk Ilmu Komputer
Anwar
2
Secara pribadi, saya merasa exec ssh server-that-does-byobu-on-login.example.comsangat menyenangkan, karena ^ A ^ D menutup terminal sama sekali. (Lebih umum lagi, exec byobu(atau exec screen, exec tmux)
Williham Totland

Jawaban:

9

Dalam skrip wrapper

exec digunakan terutama dalam skrip wrapper.

Jika Anda ingin memodifikasi lingkungan untuk program sebelum menjalankan program utama, Anda akan sering menulis skrip dan pada akhirnya memulai program utama. Tapi skrip itu tidak perlu disimpan dalam memori saat itu. Jadi, execdigunakan dalam kasus ini sehingga, program utama dapat menggantikan skrip ibu.

Ini adalah contoh praktisnya. Itu mate-terminal.wrappernaskah datang dengan pasangan-terminal. Ini dimulai mate-terminaldengan beberapa argumen tambahan dengan memeriksa lingkungan pengguna.

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

Poin yang perlu diperhatikan di sini adalah, ada execpanggilan, yang menggantikan skrip ini dalam memori.

Berikut adalah pertanyaan serupa yang dijawab di Situs Unix & Linux StackExchange - /unix//q/270929/19288

Untuk mengarahkan file-deskriptor

Penggunaan umum lainnya execadalah dalam mengarahkan file-deskriptor. stdin, stdout, stderrDapat diarahkan ke file menggunakan exec.

  1. Redirect stdout- exec 1>fileakan menyebabkan output standar menjadi file bernama fileuntuk akhir sesi shell saat ini. Apa pun untuk ditampilkan ke tampilan akan ada di file.

  2. Redirect stdin- Ini juga dapat digunakan untuk mengarahkan ulang stdinke file. Misalnya, Jika Anda ingin mengeksekusi file skrip script.sh, Anda bisa mengarahkan saja stdinke file menggunakan exec 0<script.sh.

Anwar
sumber
Baik. Setelah itu 'mate-terminal' akan memiliki PID yang dimiliki skrip wrapper? Dan apakah akan menggunakan memori yang digunakan skrip wrapper? Jadi skrip pembungkusnya telah menghilang. Kalau tidak, kedua skrip akan ada sebagai proses terpisah pada sistem (dengan dua PID berbeda)?
mizech
@ keajaiban ya. mereka menggunakan PID yang sama
Anwar
@ mizech Senang mengetahui hal itu membantu :)
Anwar
1
Contoh luar biasa, yang membuatnya sangat jelas
Zanna
Jawaban ini sebagian dan melewatkan salah satu kegunaan penting (dan khas) execyaitu penggunaannya dalam pengalihan file deskriptor.
heemayl
9

Itu exec perintah menggantikan proses shell saat ini dengan perintah yang ditentukan. Biasanya, ketika Anda menjalankan perintah proses baru muncul (bercabang). The exec perintah tidak menelurkan sebuah proses baru. Sebagai gantinya, proses saat ini dilapis dengan perintah baru. Dengan kata lain execperintah dijalankan di tempat shell saat ini tanpa membuat proses baru.

Ada tiga penggunaan perintah exec yang paling umum:

1. Penggantian proses

Contoh-1: Jika Anda membukabashshellbarusebagai

$ bash 

di pstree dalamnya terlihat seperti

├─ terminal rumah
        ├─bash───bash───pstree

bashShell sebelumnya masih ada dan Anda mendapat bashshell baru . Sedangkan jika Anda membuka bash shell baru seperti,

$ exec bash

yang pstreemenunjukkan

├─ terminal rumah
        ├─bash───tiga

Di sini yang lama bashdiganti dengan yang baru. Sangat berguna untuk keluar dari banyak login dalam satu perintah. Itu lebih aman dan menghilangkan kesempatan meninggalkan terminal terbuka karena kesalahan. Lihat Keluar dari root dan pengguna dengan satu perintah

Contoh-2: Anda dapat membuka file sebagai

$ exec vi filename.txt

Ketika Anda berhenti, vitidak perlu menutup terminal secara terpisah karena shell sudah diganti. Segera setelah Anda menutup terminal vi juga ditutup.

2. Metode pengalihan deskriptor file dalam skrip shell

Itu exec perintah juga dapat digunakan dalam skrip shell dinamis terbuka, dekat, dan menyalin file deskriptor. Itu memungkinkan melakukan pengalihan STDIN, STDERR, STDOUT dan deskriptor file lainnya ke berbagai file di dalam skrip shell, alih-alih string permintaan perintah. Jika Anda tidak menentukan perintah atau argumen, Anda bisa menentukan simbol pengalihan dan deskriptor file untuk melakukan fungsi-fungsi ini.

Katakanlah Anda memiliki skrip shell yang script.shAnda ingin memiliki file log script.log, Anda dapat menggunakan execsebagai,

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

yang setara dengan

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

3. Membuat tahapan proses menggunakan perintah exec

Anda juga dapat menggunakan perintah exec untuk membuat satu set skrip shell yang mengeksekusi satu sama lain seperti tahapan proses. Alih-alih menelurkan proses baru setiap kali Anda perlu mentransfer kontrol ke skrip berikutnya Anda menjalankan perintah exec.

Dalam hal ini pernyataan terakhir dari setiap tahap harus berupa execperintah yang memanggil tahap berikutnya.

Lihat penggunaan execperintah dalam skrip shell untuk lebih lanjut.

Catatan: Bagian di atas diambil dari ini.

souravc
sumber
1
Hanya jawaban lengkap (sejauh ini).
heemayl
Semua waktu yang saya gunakan eksekutif adalah untuk efisiensi. Jika Anda menjalankan daemon dengan exec Anda hanya perlu memiliki satu proses aktif, bukan dua. Membiarkan proses bash sekitar menghabiskan beberapa MB ram, antara lain.
gmatht
2

Sejauh yang saya tahu itu juga digunakan untuk mengarahkan file deskriptor (misalnya, STDOUT, STDERR, STDIN) dari skrip bash.

Jadi misalnya, Anda bisa membaca dari file sebagai ganti dari keyboard dengan menggunakan pengalihan STDIN dan menulis ke file bukan terminal dengan STDOUT (atau bisa STDERR tergantung pada program) pengalihan.

Levin Palm
sumber
1
Jawaban ini sebagian dan hanya melengkapi jawaban ini .
heemayl