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!

Unix / Linux - Signals and Traps

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:

  1. Menghentikan proses
  2. Mengabaikan sinyal
  3. Menyimpan core dump
  4. Menghentikan proses
  5. 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