Pendahuluan
Skrip shell dapat mengalami masalah selama eksekusinya, menghasilkan sinyal kesalahan yang menyela skrip secara tidak terduga.
Kesalahan terjadi karena desain skrip yang salah, tindakan pengguna, atau kegagalan sistem. Skrip yang gagal dapat meninggalkan file sementara yang menyebabkan masalah saat pengguna memulai ulang skrip.
Tutorial ini akan menunjukkan cara menggunakan trap perintah untuk memastikan skrip Anda selalu keluar secara terduga.
Prasyarat
- Akses ke terminal/baris perintah.
- Editor teks (Nano, Vi/Vim, dll.).
Sintaks perangkap bash
Sintaks untuk trap perintahnya adalah:
trap [options] "[arguments]" [signals] Perintah tersebut memiliki komponen berikut:
- Opsi memberikan fungsionalitas tambahan pada perintah.
- Argumen adalah perintah
trapdijalankan setelah mendeteksi sinyal. Kecuali jika perintahnya hanya satu kata, itu harus diapit dengan tanda kutip (" "). Jika argumen berisi lebih dari satu perintah, pisahkan dengan titik koma (;). - Sinyal adalah pemberitahuan asinkron yang dikirim oleh sistem, biasanya menunjukkan gangguan yang dibuat pengguna atau terkait sistem. Sinyal dapat dipanggil dengan nama atau nomornya.
Opsi Perangkap Bash
trap perintah menerima opsi berikut:
-p- Menampilkan perintah sinyal.-l- Mencetak daftar semua sinyal dan nomornya.
Di bawah ini adalah daftar lengkap 64 sinyal dan nomornya:
| # | Sinyal | # | Sinyal | # | Sinyal |
|---|---|---|---|---|---|
| 1 | SIGHUP | 23 | SIGURG | 45 | SIGRTMIN+11 |
| 2 | MASUKKAN | 24 | SIGXCPU | 46 | SIGRTMIN+12 |
| 3 | SIGQUIT | 25 | SIGXFSZ | 47 | SIGRTMIN+13 |
| 4 | SIGILL | 26 | SIGVTALRM | 48 | SIGRTMIN+14 |
| 5 | SIGTRAP | 27 | SIGPROF | 49 | SIGRTMIN+15 |
| 6 | SIGABRT | 28 | SIGWINCH | 50 | SIGRTMAX-14 |
| 7 | SIGBUS | 29 | SIGIO | 51 | SIGRTMAX-13 |
| 8 | SIGFPE | 30 | SIGPWR | 52 | SIGRTMAX-12 |
| 9 | SIGKILL | 31 | SIGSYS | 53 | SIGRTMAX-11 |
| 10 | SIGUSR1 | 32 | MENUNGGU | 54 | SIGRTMAX-10 |
| 11 | SIGSEGV | 33 | SIGLWP | 55 | SIGRTMAX-9 |
| 12 | SIGUSR2 | 34 | SIGRTMIN | 56 | SIGRTMAX-8 |
| 13 | SIGPIPE | 35 | SIGRTMIN+1 | 57 | SIGRTMAX-7 |
| 14 | SIGALRM | 36 | SIGRTMIN+2 | 58 | SIGRTMAX-6 |
| 15 | SIGTERM | 37 | SIGRTMIN+3 | 59 | SIGRTMAX-5 |
| 16 | SIGSTKFLT | 38 | SIGRTMIN+4 | 60 | SIGRTMAX-4 |
| 17 | SIGCHLD | 39 | SIGRTMIN+5 | 61 | SIGRTMAX-3 |
| 18 | SIGCONT | 40 | SIGRTMIN+6 | 62 | SIGRTMAX-2 |
| 19 | SIGSTOP | 41 | SIGRTMIN+7 | 63 | SIGRTMAX-1 |
| 20 | SIGTSTP | 42 | SIGRTMIN+8 | 64 | SIGRTMAX |
| 21 | SIGTTIN | 43 | SIGRTMIN+9 | ||
| 22 | SIGTTOU | 44 | SIGRTMIN+10 |
Sinyal yang paling umum digunakan dengan trap perintahnya adalah:
SIGHUP (1)- Pembersihan rapiSIGINT (2)- InterupsiSIGQUIT (3)- KeluarSIGABRT (6)- BatalSIGALRM (14)- Jam alarmSIGTERM (15)- Hentikan
Cara Menggunakan perangkap di Bash
Skenario tipikal untuk menggunakan trap perintah menangkap SIGINT sinyal. Sinyal ini dikirim oleh sistem saat pengguna menginterupsi eksekusi skrip dengan menekan Ctrl+C .
Contoh script berikut mencetak kata "Test " setiap detik hingga pengguna menyela dengan Ctrl+C . Script kemudian mencetak pesan dan keluar.
trap "echo The script is terminated; exit" SIGINT
while true
do
echo Test
sleep 1
done
while loop pada contoh di atas dijalankan tanpa batas. Baris pertama skrip berisi trap perintah dan instruksi untuk menunggu SIGINT sinyal, lalu cetak pesan dan keluar dari skrip.
trap perintah ini sering digunakan untuk membersihkan file-file sementara jika skrip keluar karena gangguan. Contoh berikut mendefinisikan cleanup fungsi, yang mencetak pesan, menghapus semua file yang ditambahkan ke $TRASH variabel, dan keluar dari skrip.
$TRASH=$(mktemp -t tmp.XXXXXXXXXX)
trap cleanup 1 2 3 6
cleanup()
{
echo "Removing temporary files:"
rm -rf "$TRASH"
exit
}
...
trap pada contoh di atas menjalankan cleanup berfungsi saat mendeteksi salah satu dari empat sinyal:SIGHUP , SIGINT , SIGQUIT , atau SIGABRT . Sinyal dirujuk dengan nomornya.
Anda juga dapat menggunakan trap untuk memastikan pengguna tidak dapat mengganggu eksekusi skrip. Fitur ini penting saat menjalankan perintah sensitif yang interupsinya dapat merusak sistem secara permanen. Sintaks untuk menonaktifkan sinyal adalah:
trap "" [signal]
Tanda kutip ganda berarti tidak ada perintah yang akan dieksekusi. Misalnya, untuk menjebak SIGINT dan SIGABRT sinyal, ketik:
trap "" SIGINT SIGABRT
[a command that must not be interrupted] Jika Anda ingin mengaktifkan kembali sinyal kapan saja selama skrip, setel ulang aturan dengan menggunakan simbol tanda hubung:
trap - SIGINT SIGABRT
[a command that can be interrupted]