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
trap
dijalankan 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]