Unix / Linux - Sinyal dan Tstrap
Hai sana, para ahli komputer masa depan! Hari ini, kita akan melihat dunia yang menarik dari sinyal dan trap Unix/Linux. Jangan khawatir jika Anda baru dalam programming - saya akan mengantar Anda dalam perjalanan ini langkah demi langkah, seperti yang saya lakukan untuk ribuan 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 sinyal dalam dunia Unix/Linux - suatu cara bagi proses untuk berkomunikasi secara cepat dan efisien.
Sinyal adalah interupsi perangkat lunak yang dikirim ke program untuk menandakan bahwa peristiwa penting telah terjadi. Peristiwa ini dapat berupa permintaan pengguna atau kejadian runtime yang luar biasa.
Daftar Sinyal
Seperti Chef Unix mungkin memiliki tanda tangan yang berbeda untuk " tambahkan 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 keyboard (Ctrl+C) |
SIGQUIT | 3 | Keluar dari keyboard (Ctrl+) |
SIGKILL | 9 | Sinyal kill (tidak dapat ditangkap atau diabaikan) |
SIGTERM | 15 | Sinyal terminasi |
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 ditentukan sebaliknya. Tindakan default ini seperti tanggapan instiktif staf dapur kami. Sebagai contoh:
- Hentikan proses
- Abaikan sinyal
- Buang core
- Hentikan proses
- Lanjutkan 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 biarkan nama itu menipu Anda - kill
tidak selalu menghentikan proses; itu hanya cara untuk mengirim sinyal.
Ini adalah cara Anda dapat menggunakannya:
kill -signal_name process_id
Sebagai contoh, untuk mengirim sinyal SIGTERM ke proses 1234:
kill -SIGTERM 1234
Atau, menggunakan nomor sinyal:
kill -15 1234
Menangkap Sinyal
Apa bila staf dapur kami dapat menentukan bagaimana merespon sinyal Chef Unix daripada selalu mengikuti reaksi default? Itu adalah apa yang diijinkan oleh penangkap sinyal dalam programming.
Dalam skrip shell, kita menggunakan perintah trap
untuk menangkap sinyal dan menentukan apa yang harus dilakukan saat mereka diterima. Ini adalah sintaksis 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 itu menerima SIGINT atau SIGTERM, itu akan mencetak "Bonjour!" daripada menghentikan. Itu seperti mengatakan kepada staf dapur kami, "Ketika chef menandai untuk berhenti, katakan 'Bonjour!' daripada benar-benar berhenti."
Membersihkan Berkas Temporer
Salah satu penggunaan umum penangkap adalah untuk membersihkan berkas temporer sebelum skrip keluar. Ini adalah contoh:
#!/bin/bash
# Buat berkas temporer
temp_file=$(mktemp)
# Atur penangkap 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 otomatis dihapus saat skrip keluar
Skrip ini membuat berkas temporer, menulis kepadanya, membacanya, dan kemudian menghapusnya secara otomatis saat skrip keluar, berkat penangkap.
Mengabaikan Sinyal
kadang-kadang, Anda mungkin ingin mengabaikan sinyal tertentu. Dalam analogi dapur kami, ini adalah seperti mengatakan ke chef, "Tidak matter berapa kali Anda menandai untuk lebih garam, saya tidak akan menambahkan lagi!"
Ini adalah cara Anda dapat mengabaikan sinyal:
trap "" SIGINT
Ini mengatakan ke skrip untuk melakukan apa-apa saat menerima sinyal SIGINT.
Mengatur Ulang Penangkap
Apa bila Anda ingin kembali ke perilaku default setelah menangkap sinyal? Anda dapat mengatur ulang penangkap seperti ini:
trap - SIGINT
Ini menghapus penangkap 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 penangkap
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 menangkap SIGINT, kemudian mengatur ulang penangkap setelah 10 detik. Itu seperti mengatakan kepada staf dapur kami, "Abaikan sinyal berhenti selama 10 detik, lalu kembali ke normal."
Dan itu saja, 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 konduktor orkestra proses seperti seorang maestro. Selamat coding!
Credits: Image by storyset