Unix / Linux - Sinyal dan Perangkap
Pada bab ini, kita akan membahas secara detail tentang Sinyal dan Jebakan di Unix.
Sinyal adalah interupsi perangkat lunak yang dikirim ke program untuk menunjukkan bahwa peristiwa penting telah terjadi. Peristiwa dapat bervariasi dari permintaan pengguna hingga kesalahan akses memori ilegal. Beberapa sinyal, seperti sinyal interupsi, menunjukkan bahwa pengguna telah meminta program untuk melakukan sesuatu yang tidak berada dalam aliran kontrol yang biasa.
Tabel berikut mencantumkan sinyal umum yang mungkin Anda temui dan ingin gunakan dalam program Anda -
Nama Sinyal | Nomor Sinyal | Deskripsi |
---|---|---|
SIGHUP | 1 | Hang up terdeteksi pada terminal pengendali atau matinya proses pengendalian |
SIGINT | 2 | Dikeluarkan jika pengguna mengirim sinyal interupsi (Ctrl + C) |
SIGQUIT | 3 | Dikeluarkan jika pengguna mengirim sinyal berhenti (Ctrl + D) |
SIGFPE | 8 | Dikeluarkan jika operasi matematika ilegal dicoba |
SIGKILL | 9 | Jika suatu proses mendapatkan sinyal ini, proses tersebut harus segera berhenti dan tidak akan melakukan operasi pembersihan apa pun |
SIGALRM | 14 | Sinyal jam alarm (digunakan untuk pengatur waktu) |
SIGTERM | 15 | Sinyal penghentian perangkat lunak (dikirim oleh kill secara default) |
Daftar Sinyal
Ada cara mudah untuk mencatat semua sinyal yang didukung oleh sistem Anda. Terbitkan sajakill -l perintah dan itu akan menampilkan semua sinyal yang didukung -
$ kill -l
1) SIGHUP 2) SIGINT 3) SIGQUIT 4) SIGILL
5) SIGTRAP 6) SIGABRT 7) SIGBUS 8) SIGFPE
9) SIGKILL 10) SIGUSR1 11) SIGSEGV 12) SIGUSR2
13) SIGPIPE 14) SIGALRM 15) SIGTERM 16) SIGSTKFLT
17) SIGCHLD 18) SIGCONT 19) SIGSTOP 20) SIGTSTP
21) SIGTTIN 22) SIGTTOU 23) SIGURG 24) SIGXCPU
25) SIGXFSZ 26) SIGVTALRM 27) SIGPROF 28) SIGWINCH
29) SIGIO 30) SIGPWR 31) SIGSYS 34) SIGRTMIN
35) SIGRTMIN+1 36) SIGRTMIN+2 37) SIGRTMIN+3 38) SIGRTMIN+4
39) SIGRTMIN+5 40) SIGRTMIN+6 41) SIGRTMIN+7 42) SIGRTMIN+8
43) SIGRTMIN+9 44) SIGRTMIN+10 45) SIGRTMIN+11 46) SIGRTMIN+12
47) SIGRTMIN+13 48) SIGRTMIN+14 49) SIGRTMIN+15 50) SIGRTMAX-14
51) SIGRTMAX-13 52) SIGRTMAX-12 53) SIGRTMAX-11 54) SIGRTMAX-10
55) SIGRTMAX-9 56) SIGRTMAX-8 57) SIGRTMAX-7 58) SIGRTMAX-6
59) SIGRTMAX-5 60) SIGRTMAX-4 61) SIGRTMAX-3 62) SIGRTMAX-2
63) SIGRTMAX-1 64) SIGRTMAX
Daftar sinyal yang sebenarnya berbeda-beda antara Solaris, HP-UX, dan Linux.
Tindakan Default
Setiap sinyal memiliki tindakan default yang terkait dengannya. Tindakan default untuk sinyal adalah tindakan yang dilakukan oleh skrip atau program saat menerima sinyal.
Beberapa kemungkinan tindakan default adalah -
Hentikan prosesnya.
Abaikan sinyalnya.
Buang inti. Ini membuat file bernamacore berisi gambar memori proses saat menerima sinyal.
Hentikan prosesnya.
Lanjutkan proses yang dihentikan.
Mengirim Sinyal
Ada beberapa metode untuk mengirimkan sinyal ke program atau skrip. Salah satu yang paling umum adalah pengguna mengetikCONTROL-C atau itu INTERRUPT key saat skrip sedang dijalankan.
Saat Anda menekan Ctrl+C kunci, a SIGINT dikirim ke skrip dan sesuai dengan skrip tindakan default yang ditentukan berakhir.
Metode umum lainnya untuk mengirimkan sinyal adalah dengan menggunakan kill command, sintaksnya adalah sebagai berikut -
$ kill -signal pid
Sini signal adalah nomor atau nama sinyal yang akan dikirim dan pidadalah ID proses yang sinyal harus dikirim. Sebagai Contoh -
$ kill -1 1001
Perintah di atas mengirimkan sinyal HUP atau hang-up ke program yang sedang berjalan process ID 1001. Untuk mengirim sinyal kill ke proses yang sama, gunakan perintah berikut -
$ kill -9 1001
Ini mematikan proses yang sedang berjalan process ID 1001.
Sinyal Perangkap
Ketika Anda menekan Ctrl + C atau tombol Break di terminal Anda selama eksekusi program shell, biasanya program itu segera dihentikan, dan prompt perintah Anda kembali. Ini mungkin tidak selalu diinginkan. Misalnya, Anda mungkin akan meninggalkan banyak file sementara yang tidak bisa dibersihkan.
Menangkap sinyal ini cukup mudah, dan perintah trap memiliki sintaks berikut -
$ trap commands signals
Di sini perintah dapat berupa perintah Unix yang valid, atau bahkan fungsi yang ditentukan pengguna, dan sinyal dapat berupa daftar sejumlah sinyal yang ingin Anda perangkap.
Ada dua penggunaan umum untuk perangkap dalam skrip shell -
- Bersihkan file sementara
- Abaikan sinyal
Membersihkan File Sementara
Sebagai contoh dari perintah trap, berikut ini menunjukkan bagaimana Anda dapat menghapus beberapa file dan kemudian keluar jika seseorang mencoba untuk membatalkan program dari terminal -
$ trap "rm -f $WORKDIR/work1$$ $WORKDIR/dataout$$; exit" 2
Dari program shell di mana perangkap ini dijalankan, dua file work1$$ dan dataout$$ akan otomatis terhapus jika sinyal nomor 2 diterima oleh program.
Oleh karena itu, jika pengguna menghentikan eksekusi program setelah jebakan ini dijalankan, Anda dapat yakin bahwa kedua file ini akan dibersihkan. Ituexit perintah yang mengikuti rm diperlukan karena tanpanya, eksekusi akan dilanjutkan dalam program di titik di mana ia berhenti saat sinyal diterima.
Sinyal nomor 1 dibuat untuk hangup. Entah seseorang dengan sengaja menutup sambungan atau sambungan terputus secara tidak sengaja.
Anda dapat memodifikasi perangkap sebelumnya untuk juga menghapus dua file yang ditentukan dalam kasus ini dengan menambahkan sinyal nomor 1 ke daftar sinyal -
$ trap "rm $WORKDIR/work1$$ $WORKDIR/dataout$$; exit" 1 2
Sekarang file-file ini akan dihapus jika garis ditutup atau jika tombol Ctrl + C ditekan.
Perintah yang ditentukan untuk trap harus diapit tanda kutip, jika mereka berisi lebih dari satu perintah. Juga perhatikan bahwa shell memindai baris perintah pada saat perintah trap dijalankan dan juga ketika salah satu sinyal yang terdaftar diterima.
Jadi, dalam contoh sebelumnya, nilai WORKDIR dan $$akan diganti pada saat perintah trap dijalankan. Jika Anda ingin penggantian ini terjadi pada saat sinyal 1 atau 2 diterima, Anda dapat meletakkan perintah di dalam tanda kutip tunggal -
$ trap 'rm $WORKDIR/work1$$ $WORKDIR/dataout$$; exit' 1 2
Mengabaikan Sinyal
Jika perintah yang terdaftar untuk trap adalah null, sinyal yang ditentukan akan diabaikan saat diterima. Misalnya, perintah -
$ trap '' 2
Ini menentukan bahwa sinyal interupsi harus diabaikan. Anda mungkin ingin mengabaikan sinyal tertentu saat melakukan operasi yang tidak ingin Anda ganggu. Anda dapat menentukan beberapa sinyal untuk diabaikan sebagai berikut -
$ trap '' 1 2 3 15
Perhatikan bahwa argumen pertama harus ditentukan agar sinyal diabaikan dan tidak sama dengan menulis berikut ini, yang memiliki arti tersendiri -
$ trap 2
Jika Anda mengabaikan sinyal, semua subkulit juga mengabaikan sinyal itu. Namun, jika Anda menentukan tindakan yang akan diambil saat menerima sinyal, semua subkulit akan tetap mengambil tindakan default saat menerima sinyal tersebut.
Mengatur Ulang Perangkap
Setelah Anda mengubah tindakan default yang akan diambil saat menerima sinyal, Anda dapat mengubahnya kembali dengan jebakan jika Anda mengabaikan argumen pertama; jadi -
$ trap 1 2
Ini mengatur ulang tindakan yang harus diambil setelah menerima sinyal 1 atau 2 kembali ke default.