Melayari rangkaian nasional saya terjumpa a artikel menarik (yang saya bawa ke sini secara teks kerana dijelaskan dengan mahir) di mana pengarangnya menunjukkan kepada kita bagaimana membuat skrip Bash kita lebih mantap menggunakan Traps.
Jadikan skrip bash anda lebih kuat dengan perangkap
Bayangkan bahawa anda mempunyai skrip bash yang dijalankan setiap hari setiap enam jam dan pada satu ketika ia gagal atau skrip yang sama berjalan dua kali secara serentak. Kedua-dua keadaan ini agak tidak selesa kerana mereka memerlukan campur tangan manusia untuk diperbaiki atau pada waktu-waktu tertentu mereka tidak dapat ditangani, meninggalkan sistem dalam keadaan yang tidak konsisten. Penyelesaiannya antara lain adalah dengan menggunakan perangkap.
Traps adalah kaedah yang mudah dan berkesan untuk mengawal output skrip bash. Mari kembali ke keadaan awal yang sama, jika skrip dihentikan secara manual, misalnya dengan ctrl-c, ia terganggu mengembalikan isyarat output
INT
dan jika ia berakhir dengan
kill
maka output akan menjadi
TERM
.
Semua kemungkinan kod keluar boleh dilihat
kill -l
namun yang paling banyak digunakan adalah tepat
INT, JANGKA MASA, KELUAR
Sekiranya skrip terdiri, misalnya, menyegerakkan fail dengan
rsync
perkara yang paling masuk akal adalah bergantung pada fail kunci yang tidak membenarkan skrip berjalan serentak:
LOCK = "/ var / run / rsync.lock" jika [! -e $ LOCK]; kemudian sentuh $ LOCK rsync -avz foo bar rm $ LOCK lain bergema "rsync sudah berjalan" fi
Dalam bahasa Sepanyol biasa, skrip sebelumnya memeriksa apakah fail kunci ada dan jika tidak ada, ia membuatnya dan kemudian melaksanakan perintah yang sesuai, akhirnya menghapus fail kunci. Sekiranya fail itu ada, skrip hanya mengirim pesan kepada pengguna yang menunjukkan bahawa perintah itu sudah berjalan.
Namun, ketika ada situasi yang bermasalah, file kunci tidak dapat dihilangkan, merosakkan kesan yang tidak diingini. Penyelesaiannya sangat mudah:
LOCK = "/ var / run / rsync.lock" jika [! -e $ LOCK]; kemudian perangkap "rm -f $ LOCK; exit" INT TERM EXIT sentuh $ LOCK rsync -avz foo bar rm $ LOCK trap - INT TERM EXIT lain gema "rsync sudah berjalan" fi
Kekhususan penyelesaian ini adalah bahawa perintah tertutup dalam perangkap, sehingga ketika isyarat diterima
INT, JANGKA MASA, KELUAR
skrip berhenti dan membersihkan fail kunci.
Perlu dinyatakan bahawa mungkin terdapat situasi persaingan dalam skrip di atas antara waktu fail kunci disahkan dan masa ia dibuat. Salah satu penyelesaian yang mungkin adalah menggunakan mod pengalihan dan noclobber bash yang tidak mengarahkan ke fail yang ada:
LOCK = "/ var / run / rsync.lock" if (set -o noclobber; echo $$> "$ LOCK") 2> / dev / null; kemudian perangkap 'rm -f "$ LOCK"; keluar $? ' INT TERM EXIT rsync -avz foo bar rm -f $ LOCK trap - INT TERM EXIT lain gema "rsync sudah berjalan: $ (cat $ LCK)" fi
Keanehan yang terakhir adalah bahawa ia digunakan seperti yang telah saya katakan, mod noclobber dan bahawa fail kunci mengandungi PID dari proses yang sedang dijalankan.
Perlu disebutkan bahawa ada penyelesaian lain seperti
flock
o
solo
namun dalam catatan ini saya ingin berkongsi penyelesaian dengan sumber bash sendiri. Anda boleh mengetahui lebih banyak mengenai Perangkap dengan ini panduan yang sangat baik.
Hebat! Terima kasih kerana berkongsi.
Artikel bagus, ubah saja 'echo "rsync sudah berjalan: $ (cat $ LCK)"' menjadi 'echo "rsync sudah berjalan: $ (cat $ LOCK)"'
salam
Artikel yang sangat menarik, ya tuan! Ini saya simpan.
Ini adalah arahan yang sangat berguna untuk diingat. Saya menggunakannya dalam skrip yang saya terbitkan dalam entri, untuk menghapus beberapa fail yang dibuat skrip ketika dihentikan.
Sangat menarik, ya tuan.