"[email protected]"
bit akan meluas ke daftar parameter posisi (biasanya argumen baris perintah), dikutip secara individual untuk menghindari pemisahan kata dan pembuatan nama file ("globbing").
exec
akan mengganti proses saat ini dengan proses yang dihasilkan dari mengeksekusi argumennya.
Singkatnya, exec "[email protected]"
akan menjalankan perintah yang diberikan oleh parameter baris perintah sedemikian rupa sehingga proses saat ini digantikan olehnya (jika exec
dapat menjalankan perintah sama sekali).
Dua jawaban lain menjelaskan apa exec "[email protected]"
melakukan. Jawaban di Stack Overflow ini menjelaskan mengapa ini penting bagi Docker, dan seperti yang Anda duga, ini berkaitan dengan sinyal:
Ini penting di Docker agar sinyal diproksi dengan benar. Misalnya, jika Redis dimulai tanpa
exec
, itu tidak akan menerimaSIGTERM
setelahdocker stop
dan tidak akan mendapat kesempatan untuk mematikan dengan bersih. Dalam beberapa kasus, hal ini dapat menyebabkan hilangnya data atau proses zombie.Jika Anda memulai proses anak (yaitu, jangan gunakan
exec
), proses induk menjadi bertanggung jawab untuk menangani dan meneruskan sinyal sebagaimana mestinya. Inilah salah satu alasan terbaik untuk menggunakansupervisord
atau serupa saat menjalankan beberapa proses dalam wadah, karena ini akan meneruskan sinyal dengan tepat.
"[email protected]"
di shell mirip Bourne, dalam konteks daftar diperluas ke semua parameter posisi sebagai argumen terpisah.
Dalam skrip, awalnya, parameter posisi adalah argumen yang diterima skrip itu sendiri.
exec
adalah menjalankan perintah dalam proses yang sama dengan shell. Itulah perintah terakhir yang akan dijalankan skrip karena setelah itu, proses akan menjalankan perintah lain selain shell.
Jadi, jika skrip Anda adalah
#! /bin/sh -
exec "[email protected]"
Dan Anda memanggil skrip Anda menggunakan baris perintah shell seperti:
/path/to/your-script 'echo' "some test" 'x y'
Ini akan memanggil exec
dengan echo
, some test
, dan x y
sebagai argumen yang akan mengeksekusi echo
(di sebagian besar sh
implementasi, /bin/echo
sebagai kebalikan dari echo
shell bawaan) dalam proses yang sama yang sebelumnya menjalankan shell menafsirkan skrip Anda dengan some test
dan x y
sebagai argumen.