Perangkap: buat skrip bash Anda lebih kuat

Menjelajahi jaringan nasional saya menemukan a artikel menarik (yang saya bawa ke sini secara tekstual karena dijelaskan dengan ahli) di mana penulisnya menunjukkan kepada kita bagaimana membuat skrip Bash kita lebih kuat menggunakan Perangkap.

Jadikan skrip bash Anda lebih kuat dengan jebakan

Bayangkan Anda memiliki skrip bash yang berjalan setiap hari setiap enam jam dan pada titik tertentu gagal atau skrip yang sama berjalan dua kali secara bersamaan. Kedua situasi ini cukup tidak nyaman karena membutuhkan intervensi manusia untuk dikoreksi atau pada waktu tertentu tidak dapat diatasi, meninggalkan sistem dalam keadaan tidak konsisten. Solusinya antara lain dengan menggunakan jebakan.

Perangkap adalah cara sederhana dan efektif untuk mengontrol keluaran skrip bash. Mari kita kembali ke situasi awal yang sama, jika skrip dihentikan secara manual, misalnya dengan ctrl-c, terputus mengembalikan sinyal keluaran

INT

dan jika diakhiri dengan

kill

maka hasilnya adalah

TERM.

Semua kode keluar yang memungkinkan dapat dilihat dengan

kill -l

namun yang paling banyak digunakan justru

INT, JANGKA, KELUAR

Jika skrip terdiri, misalnya, sinkronisasi file dengan

rsync

Hal yang paling masuk akal adalah mengandalkan file kunci yang tidak memungkinkan skrip untuk dijalankan secara bersamaan:

LOCK = "/ var / run / rsync.lock" jika [! -e $ KUNCI]; lalu sentuh $ LOCK rsync -avz foo bar rm $ LOCK else echo "rsync is been running" fi

Dalam bahasa Spanyol biasa, skrip sebelumnya memeriksa apakah file kunci ada dan jika tidak ada, itu membuatnya dan kemudian menjalankan perintah yang sesuai, akhirnya menghapus file kunci. Jika file tersebut ada, skrip hanya mengirim pesan ke pengguna yang menunjukkan bahwa perintah sudah berjalan.

Namun, bila ada situasi yang bermasalah dapat terjadi bahwa file kunci tidak dihilangkan, merusak efek yang tidak diinginkan. Solusinya sangat sederhana:

LOCK = "/ var / run / rsync.lock" jika [! -e $ KUNCI]; lalu trap "rm -f $ LOCK; exit" INT JANGKA KELUAR sentuh $ LOCK rsync -avz foo bar rm $ LOCK trap - INT JANGKA KELUAR lain echo "rsync sudah berjalan" fi

Kekhususan dari solusi ini adalah bahwa perintah tersebut dikurung dalam perangkap, sehingga ketika sinyal diterima

INT, JANGKA, KELUAR

skrip berhenti dan membersihkan file kunci.

Perlu dikatakan bahwa mungkin ada situasi persaingan dalam skrip di atas antara waktu file kunci diverifikasi dan waktu pembuatannya. Solusi yang mungkin adalah menggunakan mode redirect dan noclobber bash yang tidak mengalihkan ke file yang ada:

LOCK = "/ var / run / rsync.lock" if (set -o noclobber; echo $$> "$ LOCK") 2> / dev / null; lalu perangkap 'rm -f "$ LOCK"; keluar $? ' INT TERM EXIT rsync -avz foo bar rm -f $ LOCK trap - INT JANGKA KELUAR lain echo "rsync sudah berjalan: $ (cat $ LCK)" fi

Keunikan yang terakhir adalah bahwa ini digunakan seperti yang telah saya katakan, mode noclobber dan bahwa file kunci berisi PID dari proses yang sedang dijalankan.

Perlu juga disebutkan bahwa ada solusi lain seperti

flock

o

solo

Namun dalam posting ini saya ingin berbagi solusi dengan sumber daya bash sendiri. Anda dapat mempelajari lebih lanjut tentang Perangkap dengan ini panduan yang sangat baik.


tinggalkan Komentar Anda

Alamat email Anda tidak akan dipublikasikan. Bidang yang harus diisi ditandai dengan *

*

*

  1. Penanggung jawab data: Miguel Ángel Gatón
  2. Tujuan data: Mengontrol SPAM, manajemen komentar.
  3. Legitimasi: Persetujuan Anda
  4. Komunikasi data: Data tidak akan dikomunikasikan kepada pihak ketiga kecuali dengan kewajiban hukum.
  5. Penyimpanan data: Basis data dihosting oleh Occentus Networks (UE)
  6. Hak: Anda dapat membatasi, memulihkan, dan menghapus informasi Anda kapan saja.

  1.   Rafael Castro dijo

    Bagus! Terima kasih telah berbagi.

  2.   nx dijo

    Artikel bagus, ganti saja 'echo "rsync sudah berjalan: $ (cat $ LCK)"' menjadi 'echo "rsync sudah berjalan: $ (cat $ LOCK)"'

    salam

  3.   dglangos.dll dijo

    Artikel yang sangat menarik ya pak! Ini saya simpan.

  4.   Joaquin dijo

    Ini adalah perintah yang sangat berguna untuk diingat. Saya menggunakannya dalam skrip yang saya terbitkan dalam sebuah posting, untuk menghapus beberapa file yang dibuat skrip ketika dihentikan.

  5.   DaniFP dijo

    Menarik sekali ya pak.