Perangkap: jadikan skrip bash anda lebih mantap

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.


Tinggalkan komen anda

Alamat email anda tidak akan disiarkan. Ruangan yang diperlukan ditanda dengan *

*

*

  1. Bertanggungjawab atas data: Miguel Ángel Gatón
  2. Tujuan data: Mengendalikan SPAM, pengurusan komen.
  3. Perundangan: Persetujuan anda
  4. Komunikasi data: Data tidak akan disampaikan kepada pihak ketiga kecuali dengan kewajiban hukum.
  5. Penyimpanan data: Pangkalan data yang dihoskan oleh Occentus Networks (EU)
  6. Hak: Pada bila-bila masa anda boleh menghadkan, memulihkan dan menghapus maklumat anda.

  1.   Raphael Castro kata

    Hebat! Terima kasih kerana berkongsi.

  2.   nx kata

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

    salam

  3.   dglangos kata

    Artikel yang sangat menarik, ya tuan! Ini saya simpan.

  4.   Joaquin kata

    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.

  5.   DaniFP kata

    Sangat menarik, ya tuan.