Cara mengubah suai tingkah laku skrip pada isyarat menggunakan perangkap bash

Cara mengubah suai tingkah laku skrip pada isyarat menggunakan perangkap bash

Objektif

Objektif tutorial ini adalah untuk menerangkan cara menggunakan shell bash perangkap dibina untuk menjadikan skrip kami dapat melakukan tindakan tertentu apabila mereka menerima isyarat atau dalam situasi tertentu yang lain.

Keperluan

  • Tiada keperluan khas

Kesukaran

Mudah

Konvensyen

  • # - Memerlukan arahan Linux yang diberikan dengan keistimewaan akar sama ada
    secara langsung sebagai pengguna akar atau dengan menggunakan sudo perintah
  • $ - Memerlukan arahan Linux yang diberikan sebagai pengguna yang tidak layak

Pengenalan

Semasa menulis skrip yang dimaksudkan untuk berlari untuk masa yang agak lama, sangat penting untuk meningkatkan keteguhan mereka dengan membuat mereka dapat bertindak balas terhadap isyarat sistem, melaksanakan tindakan tertentu ketika beberapa daripadanya diterima. Kami dapat melaksanakan tugas ini dengan menggunakan bash perangkap dibina.

Apa itu perangkap?

Perangkap adalah mekanisme bash yang membolehkan menyesuaikan tingkah laku skrip apabila ia menerima isyarat. Contohnya, ini sangat berguna, untuk memastikan sistem itu sentiasa berada dalam keadaan yang konsisten. Bayangkan anda telah menulis skrip yang semasa runtime perlu membuat beberapa direktori: jika, contohnya isyarat sigint dihantar kepadanya, skrip akan terganggu, meninggalkan direktori yang dibuatnya. Menggunakan perangkap kita dapat mengendalikan situasi seperti ini.

Sintaks perangkap

Sintaks perangkap sangat mudah dan mudah difahami: Pertama kita mesti memanggil perangkap yang dibina, diikuti dengan tindakan yang akan dilaksanakan, maka kita mesti menentukan isyarat yang kita ingin bertindak balas terhadap:

perangkap [-lp] [[arg] sigspec]

Mari lihat apa yang mungkin perangkap pilihan adalah untuk.

Apabila digunakan dengan -L Bendera, perintah perangkap hanya akan memaparkan senarai isyarat yang berkaitan dengan nombor mereka. Ia adalah output yang sama yang anda boleh mendapatkan menjalankan bunuh -l Perintah:

$ perangkap -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) Sigstkflt 17) sigchld 18) sigcont 19) sigstop 20) sigtstp 21) sigttin 22) sigttou 23) sigurg 24) sigxcpu 25) sigxfsz 26) sigvtalrm 27) 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) 45) Sigrtmin+11 46) Sigrtmin+12 47) Sigrtmin+13 48) Sigrtmin+14 49) Sigrtmin+15 50) Sigrtmax-14 51) Sigrtmax-13 52) 55) SIGRTMAX-9 56) SIGRTMAX-8 57) SIGRTMAX-7 58) SIGRTMAX-6 59) SIGRTMAX-5 60) SIGRTMAX-4 61) SIGRTMAX-3) 

Sangat penting untuk menyatakan bahawa mungkin untuk bertindak balas hanya kepada isyarat yang membolehkan skrip bertindak balas: Sigkill dan Sigstop Isyarat tidak dapat ditangkap, disekat atau diabaikan.

Selain daripada isyarat, perangkap juga boleh bertindak balas terhadap beberapa Pseudo-Signal seperti keluar, salah atau debug, tetapi kita akan melihatnya secara terperinci kemudian. Buat masa ini ingat bahawa isyarat boleh ditentukan sama ada dengan nombornya atau dengan namanya, walaupun tanpa Sig awalan.

Mengenai -p pilihan sekarang. Pilihan ini hanya masuk akal apabila arahan tidak disediakan (jika tidak, ia akan menghasilkan ralat). Apabila perangkap digunakan dengannya, senarai perangkap yang ditetapkan sebelumnya akan dipaparkan. Jika nama atau nombor isyarat ditentukan, hanya perangkap yang ditetapkan untuk isyarat tertentu yang akan dipaparkan, jika tidak, tiada perbezaan akan dibuat, dan semua perangkap akan dipaparkan:

$ perangkap 'echo "Sigint ditangkap!"'Sigint

Kami menetapkan perangkap untuk menangkap isyarat sigint: ia hanya akan memaparkan mesej "sigint ditangkap" pada skrin apabila isyarat diberikan akan diterima oleh cangkang. Jika kita kini menggunakan perangkap dengan pilihan -p, ia akan memaparkan perangkap yang baru saja kita tentukan:

$ perangkap -p perangkap -'echo' sigint ditangkap!"'Sigint 

Dengan cara ini, perangkap kini "aktif", jadi jika kita menghantar isyarat sigint, sama ada menggunakan arahan membunuh, atau dengan pintasan Ctrl-C, perintah yang berkaitan dalam perangkap akan dilaksanakan (^c hanya dicetak kerana gabungan utama):

^Csigint ditangkap!

Perangkap dalam tindakan

Kami kini akan menulis skrip mudah untuk menunjukkan perangkap dalam tindakan, di sini adalah:

#!/usr/bin/env bash # # skrip mudah untuk menunjukkan bagaimana perangkap berfungsi # set -e set -u set -o pipefail trap 'echo "isyarat ditangkap, pembersihan ..."; rm -i linux_tarball.tar.xz 'sigint sigterm echo "memuat turun tarball ..." wget -o linux_tarball.tar.xz https: // cdn.kernel.org/pub/linux/kernel/v4.x/linux-4.13.5.tar.xz &> /dev /null
Salinan

Skrip di atas hanya cuba memuat turun tarball kernel Linux terkini ke dalam direktori dari apa yang dilancarkan menggunakan wget. Semasa tugas, jika isyarat sigint atau sigterm diterima (perhatikan bagaimana anda boleh menentukan lebih daripada satu isyarat pada baris yang sama), fail yang dimuat turun sebahagiannya akan dipadamkan.

Dalam hal ini perintah sebenarnya dua: yang pertama adalah echo yang mencetak mesej di skrin, dan yang kedua adalah sebenarnya rm Perintah (kami menyediakan pilihan -i, jadi ia akan meminta pengesahan pengguna sebelum mengeluarkan), dan mereka dipisahkan oleh titik koma. Daripada menentukan arahan dengan cara ini, anda juga boleh memanggil fungsi: ini akan memberi anda lebih banyak kebolehgunaan. Perhatikan bahawa jika anda tidak memberikan arahan, isyarat (s) hanya akan diabaikan!

Ini adalah output skrip di atas apabila ia menerima isyarat Sigint:

$ ./Fetchlinux.SH memuat turun tarball ... ^csignal ditangkap, pembersihan ... rm: keluarkan fail biasa 'linux_tarball.tar.xz '? 

Perkara yang sangat penting untuk diingat ialah apabila skrip ditamatkan oleh isyarat, seperti di atas, statusnya akan menjadi hasil dari 128 + nombor isyarat. Seperti yang anda lihat, skrip di atas, yang ditamatkan oleh sigint, mempunyai status keluar dari 130:

$ echo $? 130 

Terakhir, anda boleh melumpuhkan perangkap hanya dengan menghubungi perangkap diikuti oleh - tanda, diikuti dengan nama atau nombor isyarat:

Perangkap - Sigint Sigterm

Isyarat akan mengambil semula nilai yang mereka ada di pintu masuk ke kerang.

Isyarat pseudo

Seperti yang telah disebutkan di atas, perangkap boleh ditetapkan bukan sahaja untuk isyarat yang membolehkan skrip bertindak balas tetapi juga kepada apa yang kita boleh panggil "pseudo-signals". Mereka bukan isyarat secara teknikal, tetapi sesuai dengan situasi tertentu yang boleh ditentukan:

Keluar

Bila Keluar ditentukan dalam perangkap, perintah perangkap akan dilaksanakan pada keluar dari cangkang.

Err

Ini akan menyebabkan hujah perangkap dilaksanakan apabila arahan mengembalikan status keluar bukan sifar, dengan beberapa pengecualian (sama dengan pilihan shell errexit): Perintah itu tidak boleh menjadi sebahagian daripada a manakala atau sehingga gelung; ia tidak boleh menjadi sebahagian daripada jika membina, atau sebahagian daripada a && atau || senarai, dan nilainya tidak boleh terbalik dengan menggunakan ! pengendali.

Debug

Ini akan menyebabkan hujah perangkap dilaksanakan sebelum setiap arahan mudah,
untuk, kes atau pilih arahan, dan sebelum arahan pertama dalam fungsi shell.

Kembali

Hujah perangkap dilaksanakan selepas fungsi atau skrip yang diperoleh dengan menggunakan sumber atau . perintah.

Tutorial Linux Berkaitan:

  • Cara menyebarkan isyarat kepada proses kanak -kanak dari bash ..
  • Cara Melaksanakan Operasi Pentadbiran dengan Ansible ..
  • Cara memasang isyarat pada linux
  • Perkara yang hendak dipasang di Ubuntu 20.04
  • Cara Menggunakan Perintah Killall di Linux
  • Cara keluar dari skrip bash
  • Perkara yang perlu dilakukan setelah memasang ubuntu 20.04 Focal Fossa Linux
  • Perintah Linux: Top 20 Perintah Paling Penting yang Anda Perlu ..
  • Saiz Cakera Meningkatkan VirtualBox di Linux
  • Panduan Penyelesaian Masalah Umum GNU/Linux untuk Pemula