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!

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 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:

  1. Hentikan proses
  2. Abaikan sinyal
  3. Buang core
  4. Hentikan proses
  5. 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