Cara memodifikasi perilaku skrip pada sinyal menggunakan perangkap bash

Cara memodifikasi perilaku skrip pada sinyal menggunakan perangkap bash

Objektif

Tujuan dari tutorial ini adalah untuk menggambarkan cara menggunakan shell bash perangkap dibangun untuk membuat skrip kami dapat melakukan tindakan tertentu ketika mereka menerima sinyal atau dalam situasi spesifik lainnya.

Persyaratan

  • Tidak ada persyaratan khusus

Kesulitan

MUDAH

Konvensi

  • # - mensyaratkan perintah linux yang diberikan untuk dieksekusi dengan hak istimewa root
    langsung sebagai pengguna root atau dengan menggunakan sudo memerintah
  • $ - mensyaratkan perintah Linux yang diberikan untuk dieksekusi sebagai pengguna biasa

Perkenalan

Saat menulis skrip yang dimaksudkan untuk berjalan untuk waktu yang cukup, sangat penting untuk meningkatkan ketahanan mereka dengan membuat mereka dapat bereaksi terhadap sinyal sistem, menjalankan tindakan tertentu ketika beberapa dari mereka diterima. Kita dapat menyelesaikan tugas ini dengan menggunakan pesta perangkap builtin.

Apa itu perangkap?

Perangkap adalah mekanisme bash yang memungkinkan untuk menyesuaikan perilaku skrip saat menerima sinyal. Ini sangat berguna, misalnya, untuk memastikan bahwa sistem selalu dalam keadaan yang konsisten. Bayangkan Anda telah menulis skrip yang selama runtime -nya perlu membuat beberapa direktori: jika, misalnya sinyal sigint dikirim ke sana, skrip akan terganggu, meninggalkan direktori yang dibuatnya. Menggunakan perangkap kami dapat menangani situasi seperti ini.

Sintaks perangkap

Sintaks perangkap sangat sederhana dan mudah dimengerti: Pertama -tama kita harus memanggil perangkap builtin, diikuti oleh tindakan yang akan dieksekusi, maka kita harus menentukan sinyal yang ingin kita bereaksi terhadap:

jebakan [-lp] [[arg] sigspec]

Mari kita lihat apa yang mungkin terjadi perangkap opsi untuk.

Saat digunakan dengan -l Bendera, perintah perangkap hanya akan menampilkan daftar sinyal yang terkait dengan nomor mereka. Output yang sama Anda dapat memperoleh menjalankan Bunuh -L memerintah:

$ trap -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) ) 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) 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+8 43) SIGRTMIN+9 44) 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-12) 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) 

Sangat penting untuk menentukan bahwa mungkin untuk bereaksi hanya terhadap sinyal yang memungkinkan skrip untuk merespons: Sigkill Dan Sigstop sinyal tidak dapat ditangkap, diblokir atau diabaikan.

Terlepas dari sinyal, perangkap juga dapat bereaksi terhadap beberapa Signal semu seperti keluar, err atau debug, tetapi kami akan melihatnya secara rinci nanti. Untuk saat ini, ingatlah bahwa sinyal dapat ditentukan baik dengan nomornya atau dengan namanya, bahkan tanpa Sig awalan.

Tentang -P opsi sekarang. Opsi ini hanya masuk akal jika perintah tidak disediakan (jika tidak, ia akan menghasilkan kesalahan). Saat perangkap digunakan dengannya, daftar perangkap yang sebelumnya diatur akan ditampilkan. Jika nama atau nomor sinyal ditentukan, hanya set perangkap untuk sinyal spesifik yang akan ditampilkan, jika tidak tidak ada perbedaan yang akan dibuat, dan semua perangkap akan ditampilkan:

$ trap 'echo "Sigint tertangkap!"Sigint

Kami mengatur jebakan untuk menangkap sinyal sigint: itu hanya akan menampilkan pesan "Sigint tertangkap" di layar ketika sinyal yang diberikan akan diterima oleh shell. Jika kita sekarang menggunakan perangkap dengan opsi -p, itu akan menampilkan perangkap yang baru saja kita tentukan:

$ trap -p trap -'echo "Sigint tertangkap!"Sigint 

Ngomong-ngomong, jebakan sekarang "aktif", jadi jika kita mengirim sinyal sigint, baik menggunakan perintah kill, atau dengan pintasan ctrl-c, perintah yang terkait dalam perangkap akan dieksekusi (^C hanya dicetak karena dari kombinasi kunci):

^Csigint tertangkap!

Jebakan beraksi

Kami sekarang akan menulis skrip sederhana untuk menampilkan jebakan beraksi, ini dia:

#!/usr/bin/env bash # # skrip sederhana untuk menunjukkan cara kerja perangkap # set -e set -u set -o pipefail trap 'echo "sinyal tertangkap, membersihkan ..."; rm -i linux_tarball.ter.xz 'sigint sigterm echo "mengunduh tarball ..." wget -o linux_tarball.ter.xz https: // cdn.inti.org/pub/linux/kernel/v4.X/Linux-4.13.5.ter.xz &> /dev /null
Menyalin

Skrip di atas hanya mencoba mengunduh tarball kernel linux terbaru ke direktori dari apa yang diluncurkan menggunakan wget. Selama tugas, jika sinyal SIGINT atau SIGTERS diterima (perhatikan bagaimana Anda dapat menentukan lebih dari satu sinyal pada baris yang sama), file yang diunduh sebagian akan dihapus.

Dalam hal ini perintah sebenarnya dua: yang pertama adalah gema Yang mencetak pesan di layar, dan yang kedua adalah yang sebenarnya rm Perintah (kami memberikan opsi -i untuk itu, jadi itu akan meminta konfirmasi pengguna sebelum menghapus), dan mereka dipisahkan oleh titik koma. Alih-alih menentukan perintah dengan cara ini, Anda juga dapat memanggil fungsi: Ini akan memberi Anda lebih banyak penggunaan kembali. Perhatikan bahwa jika Anda tidak memberikan perintah apa pun, sinyal hanya akan diabaikan!

Ini adalah output dari skrip di atas saat menerima sinyal SIGINT:

$ ./fetchlinux.SH Mengunduh Tarball… ^CSignal Tertangkap, Membersihkan ... RM: Hapus File Reguler 'Linux_Tarball.ter.xz '? 

Hal yang sangat penting untuk diingat adalah bahwa ketika skrip diakhiri oleh sinyal, seperti di atas, status yang ada akan menjadi hasil dari 128 + Nomor Sinyal. Seperti yang Anda lihat, skrip di atas, diakhiri oleh sigint, memiliki status keluar 130:

$ echo $? 130 

Terakhir, Anda dapat menonaktifkan jebakan hanya dengan menelepon perangkap diikuti oleh - tanda, diikuti dengan nama atau nomor sinyal:

TRAP - SIGINT SIGTERM

Sinyal akan mengambil kembali nilai yang mereka miliki di pintu masuk ke shell.

Sinyal semu

Seperti yang telah disebutkan di atas, Trap dapat ditetapkan tidak hanya untuk sinyal yang memungkinkan skrip untuk merespons tetapi juga apa yang dapat kita sebut "sinyal semu". Mereka bukan sinyal secara teknis, tetapi sesuai dengan situasi tertentu yang dapat ditentukan:

KELUAR

Kapan KELUAR ditentukan dalam perangkap, perintah perangkap akan dieksekusi saat keluar dari shell.

BERBUAT SALAH

Ini akan menyebabkan argumen perangkap dieksekusi ketika sebuah perintah mengembalikan status keluar non-nol, dengan beberapa pengecualian (sama dengan opsi shell errexit): perintah tidak boleh menjadi bagian dari a ketika atau sampai lingkaran; itu tidak boleh menjadi bagian dari jika membangun, atau bagian dari a && atau || daftar, dan nilainya tidak boleh dibalik dengan menggunakan ! operator.

Debug

Ini akan menyebabkan argumen perangkap dieksekusi sebelum setiap perintah sederhana,
untuk, kasus atau Pilih perintah, dan sebelum perintah pertama dalam fungsi shell.

KEMBALI

Argumen perangkap dieksekusi setelah fungsi atau skrip yang bersumber dengan menggunakan sumber atau . memerintah.

Tutorial Linux Terkait:

  • Cara menyebarkan sinyal untuk proses anak dari pesta ..
  • Bagaimana melakukan operasi administrasi dengan ansible…
  • Cara Menginstal Sinyal di Linux
  • Hal -hal yang harus diinstal pada ubuntu 20.04
  • Cara menggunakan perintah killall di linux
  • Cara keluar dari naskah bash
  • Hal -hal yang harus dilakukan setelah menginstal ubuntu 20.04 FOSSA FOSSA Linux
  • Perintah Linux: 20 perintah terpenting teratas yang Anda butuhkan untuk…
  • VirtualBox Meningkatkan Ukuran Disk di Linux
  • Panduan Pemecahan Masalah Umum GNU/Linux untuk Pemula