Unix / Linux - Sinyal dan Trap
Halo sana, para ahli komputer masa depan! Hari ini, kita akan menyelam ke dunia yang menarik dari sinyal dan trap Unix/Linux. Jangan khawatir jika Anda baru dalam programming - saya akan memandu Anda dalam perjalanan ini langkah demi langkah, seperti yang saya lakukan bagi banyak murid selama tahun-tahun mengajar saya. Jadi, mari kita mulai perjalanan menarik ini bersama!
Apa Itu Sinyal?
Bayangkan Anda berada di dapur restoran yang sibuk. Chef ( mari kita sebutnya Chef Unix) perlu mengirimkan pesan ke stafnya dengan cepat. Daripada menjerit melewati keramaian, dia menggunakan sistem tanda tangan. Itu seolah-olah apa yang sinyal dalam dunia Unix/Linux - cara untuk proses saling berkomunikasi secara cepat dan efisien.
Sinyal adalah interupsi perangkat lunak yang dikirim ke program untuk menandakan bahwa peristiwa penting telah terjadi. Peristiwa ini bisa berupa permintaan pengguna atau kejadian runtime yang eksepsi.
Daftar Sinyal
Seperti Chef Unix mungkin memiliki tanda tangan berbeda untuk "tambah garam," "cepat," atau "ambil istirahat," sistem Unix/Linux memiliki berbagai sinyal untuk tujuan yang berbeda. Mari kita lihat beberapa yang paling umum:
Nama Sinyal | Nomor Sinyal | Deskripsi |
---|---|---|
SIGHUP | 1 | Deteksi hangup pada terminal pengontrol atau kematian proses pengontrol |
SIGINT | 2 | Interupsi dari papan ketik (Ctrl+C) |
SIGQUIT | 3 | Keluar dari papan ketik (Ctrl+) |
SIGKILL | 9 | Sinyal kill (tidak dapat ditangkap atau diabaikan) |
SIGTERM | 15 | Sinyal termination |
SIGSTOP | 17, 19, 23 | Hentikan proses (tidak dapat ditangkap atau diabaikan) |
Tindakan Default
Ketika sinyal dikirim ke proses, proses itu akan mengambil tindakan default kecuali diperintahkan lain. Tindakan default ini mirip dengan tanggapan instiktif staf dapur kita. Sebagai contoh:
- Menghentikan proses
- Mengabaikan sinyal
- Menyimpan core dump
- Menghentikan proses
- Melanjutkan proses yang dihentikan
Mengirim Sinyal
Sekarang, mari kita belajar bagaimana mengirim sinyal ini. Dalam Unix/Linux, kita menggunakan perintah kill
untuk mengirim sinyal ke proses. Jangan terganggu oleh nama - kill
tidak selalu menghentikan proses; itu hanya cara untuk mengirim sinyal.
Ini adalah cara Anda dapat menggunakannya:
kill -signal_name process_id
Misalnya, untuk mengirim sinyal SIGTERM ke proses 1234:
kill -SIGTERM 1234
Atau, menggunakan nomor sinyal:
kill -15 1234
Menangkap Sinyal
Apa bila staf dapur kita dapat menentukan bagaimana merespon sinyal Chef Unix daripada selalu mengikuti reaksi default? Itu adalah apa yang diijinkan oleh penangkapan sinyal dalam programming.
Dalam skrip shell, kita menggunakan perintah trap
untuk menangkap sinyal dan menentukan apa yang harus dilakukan saat mereka diterima. Ini adalah sintaks dasar:
trap command signal(s)
Mari kita lihat contoh:
#!/bin/bash
trap "echo Bonjour!" SIGINT SIGTERM
echo "It's a trap!"
while true
do
sleep 60
done
Dalam skrip ini, jika menerima SIGINT atau SIGTERM, itu akan mencetak "Bonjour!" daripada menghentikan. Itu seperti mengatakan kepada staf dapur kita, "Ketika chef memberikan tanda untuk berhenti, katakan 'Bonjour!' daripadabenar-benar berhenti."
Membersihkan Berkas Temporer
Salah satu penggunaan umum trap adalah untuk membersihkan berkas temporer sebelum skrip keluar. Ini adalah contoh:
#!/bin/bash
# Buat berkas temporer
temp_file=$(mktemp)
# Atur trap untuk menghapus berkas temporer saat keluar
trap "rm -f $temp_file" EXIT
# Gunakan berkas temporer
echo "Hello, World!" > $temp_file
cat $temp_file
# Berkas temporer akan secara otomatis dihapus saat skrip keluar
Skrip ini membuat berkas temporer, menulis kepadanya, membacanya, dan kemudian secara otomatis menghapusnya saat skrip keluar, karena trap.
Mengabaikan Sinyal
kadang-kadang, Anda mungkin ingin mengabaikan sinyal tertentu. Dalam analogi dapur kita, ini seperti mengatakan kepada chef, "Tidak peduli berapa kali Anda menandai untuk tambah garam, saya tidak akan menambah lagi!"
Ini adalah cara Anda dapat mengabaikan sinyal:
trap "" SIGINT
Ini memberitahu skrip untuk melakukan apa-apa saat menerima sinyal SIGINT.
Mengatur Ulang Trap
Apa bila Anda ingin kembali ke perilaku default setelah menangkap sinyal? Anda dapat mengatur ulang trap seperti ini:
trap - SIGINT
Ini menghapus trap untuk SIGINT, kembali ke perilaku default.
Ini adalah contoh yang lebih lengkap:
#!/bin/bash
# Awalnya, tangkap SIGINT
trap "echo You can't stop me!" SIGINT
echo "Try to stop me with Ctrl+C..."
sleep 10
# Sekarang, atur ulang trap
trap - SIGINT
echo "Okay, now you can stop me with Ctrl+C..."
sleep 10
echo "If you see this, you didn't stop me!"
Skrip ini pertama-tama menangkap SIGINT, kemudian mengatur ulang trap setelah 10 detik. Itu seperti mengatakan kepada staf dapur, "Abaikan tanda berhenti selama 10 detik, lalu kembali ke normal."
Dan begitu juga, teman-teman! Kita telah melakukan perjalanan melalui negeri sinyal dan trap Unix/Linux. Ingat, latihan membuat sempurna. Cobalah menulis skrip Anda sendiri, mainkan dengan sinyal yang berbeda, dan segera Anda akan menjadi maestro yang mengelola orkestra proses Anda sendiri. Selamat coding!
Credits: Image by storyset