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.
Bagus! Terima kasih telah berbagi.
Artikel bagus, ganti saja 'echo "rsync sudah berjalan: $ (cat $ LCK)"' menjadi 'echo "rsync sudah berjalan: $ (cat $ LOCK)"'
salam
Artikel yang sangat menarik ya pak! Ini saya simpan.
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.
Menarik sekali ya pak.