alasan untuk exec dalam skrip wrapper

27

Saya telah melihat contoh skrip wrapper yang singkatnya adalah sebagai berikut:

#!/bin/bash

myprog=sleep
echo "This is the wrapper script, it will exec "$myprog""

exec "$myprog" "$@"

Seperti yang terlihat di atas, mereka menggunakan execuntuk segera mengganti shell yang baru dibuat dengan $myprog. Seseorang dapat mencapai hal yang sama tanpa exec:

#!/bin/bash

myprog=sleep
echo "This is the wrapper script, it will exec "$myprog""

"$myprog" "$@"

Dalam contoh terakhir ini, instance bash baru dimulai dan kemudian $myprogdimulai sebagai proses anak dari instance bash.

Apa manfaat dari pendekatan pertama?

Martin
sumber
Lihat misalnya stackoverflow.com/questions/18351198/…
Thomas Dickey

Jawaban:

31

Menggunakan execmembuat pembungkus lebih transparan, yaitu membuatnya lebih kecil kemungkinannya bahwa pengguna atau aplikasi yang memanggil skrip perlu menyadari bahwa itu adalah relay yang pada gilirannya meluncurkan program "nyata".

Secara khusus, jika penelepon ingin mematikan program, mereka hanya akan mematikan proses yang baru saja mereka luncurkan. Jika skrip wrapper menjalankan proses anak, penelepon harus tahu bahwa mereka harus mencari tahu anak bungkusnya dan membunuh itu sebagai gantinya. Skrip pembungkus dapat mengatur jebakan untuk menyampaikan beberapa sinyal, tetapi itu tidak akan bekerja dengan SIGSTOP atau SIGKILL yang tidak dapat ditangkap.

Memanggil execjuga menghemat sedikit memori (dan sumber daya lain seperti PID, dll.) Karena tidak perlu menyimpan shell tambahan tanpa harus melakukan apa pun.

Jika ada beberapa pembungkus, masalah bertambah (kesulitan dalam menemukan proses yang tepat untuk membunuh, memori overhead, dll.).

Beberapa shell (mis. Korn shell) secara otomatis mendeteksi kapan sebuah perintah adalah yang terakhir dan tidak ada trap aktif dan meletakkan implisit exec, tetapi tidak semua melakukan (mis. Bukan bash).

Gilles 'SANGAT berhenti menjadi jahat'
sumber
10

Tidak menemukan duplikat ... lihat buku pegangan FreeBSD , yang memberikan alasan yang cukup baik:

The execpernyataan menggantikan proses shell dengan program tertentu. Jika execdihilangkan, proses shell tetap dalam memori saat program sedang dijalankan, dan menghabiskan sumber daya sistem dengan sia - sia .

yang pada dasarnya alasannya dijelaskan kepada saya beberapa waktu lalu (oleh salah satu kuli), dan cukup terkenal.

Thomas Dickey
sumber