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.